php 查找数组指定元素,php查找数组元素各种方法总结

在php中数据查询可以分类一维数组查找,与多维数组查找了,如果是简单的一维数组我们可以直接使用in_array ,array_search 与遍历来实例了,如果是多维数组就需要使用其它办法。

对于一维数组我们可以如下操作

in_array  '函数在数组中搜索给定的值。in_array(value,array,type)type 可选。如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同。

array_key_exists 'array_key_exists() 函数判断某个数组中是否存在指定的 key,如果该 key 存在,则返回 true,否则返回 false。array_key_exists(key,array)

array_search 'array_search() 函数与 in_array() 一样,在数组中查找一个键值。如果找到了该值,匹配元素的键名会被返回。如果没找到,则返回 false。array_search(value,array,strict)

从这里来看,在数据量不大的时候,比如小于1000,查找用哪一种都行,都不会成为瓶颈;

当数据量比较大的时候,用array_key_exists比较合适。

当然这里array_key_exists占用的内存比较大,经测算

二分法查找数组是否包含某一元素,兼容正反序,代码实现:

 代码如下复制代码

$searchValue = (int)$_GET['key'];

function search(array $array, $value)

{

$max = count($array)-1;

$min = 0;

$isAscSort = $array[$min] < $array[$max];

while (TRUE) {

$sum = $min $max;

$midKey = (int)($sum%2 == 1 ? ceil($sum/2) : $sum/2);

if ($max < $min) {

return -1;

} else if ($value == $array[$midKey]) {

return 1;

} else if ($value > $array[$midKey]) {

$isAscSort ? $min = $midKey 1 : $max = $midKey-1;

} else if ($value < $array[$midKey]) {

$isAscSort ? $max = $midKey-1 : $min = $midKey 1;

}

}

}

$array = array(

'4', '5', '7', '8', '9', '10', '11', '12'

);

// 正序

echo search($array, $searchValue);

// 逆序

rsort($array);

echo search($array, $searchValue);

例二

PHP 查找数组第i小元素

 代码如下复制代码

#随机选择第i小的数字,用随机快排实现

#交换元素

function swap(&$arr, $i, $j) {

$temp = $arr[$i];

$arr[$i] = $arr[$j];

$arr[$j] = $temp;

}

#随机划分

function randomized_partition(&$arr, $begin, $end) {

$rand_inx = rand($begin, $end);

swap($arr, $begin, $rand_inx);

return partition($arr, $begin, $end);

}

#划分

function partition(&$arr, $begin, $end) {

#以第一个元素作为中枢元素

$pivot = $begin;

$low = $begin;

$high = $end;

while ($low < $high) {

while ($low < $high && $arr[$low] <= $arr[$pivot]) {

$low ;

}

while ($low < $high && $arr[$high] >= $arr[$pivot]) {

$high--;

}

swap($arr, $low, $high);

}

#交换中枢元素

if ($arr[$pivot] < $arr[$low]) {

$low--;

}

swap($arr, $pivot, $low);

return $low;

}

#快速排序,此处没用到

function quick_sort(&$arr, $begin, $end) {

$q = randomized_partition($arr, $begin, $end);

if ($q > $begin) {

quick_sort($arr, $begin, $q - 1);

}

if ($q < $end) {

quick_sort($arr, $q 1, $end);

}

}

#选取第i小的数

function randomized_select(&$arr, $begin, $end, $i) {

if ($begin == $end) {

return $arr[$begin];

}

$q = randomized_partition($arr, $begin, $end);

$k = $q - $begin 1; #k代表小于等于q的元素个数

if ($k == $i) { #如果k=i,说明q就是第i小的元素坐标

return $arr[$q];

} else if ($i < $k) { #如果i

return randomized_select($arr, $begin, $q - 1, $i);

} else { #第i小的元素位于q的右边,此时查找右边的第i-k小的元素

return randomized_select($arr, $q 1, $end, $i - $k);

}

}

$arr = array(1, 5, 3, 7, 0, 0, 8, 4, 2, 9, 11);

$t = randomized_select($arr, 0, count($arr) - 1, 8);

print_r("The 8th minimum element: {$t}");

echo "
";

quick_sort($arr, 0, count($arr) - 1);

print_r($arr);

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值