加入收藏 | 设为首页 | 会员中心 | 我要投稿 岳阳站长网 (https://www.0730zz.com.cn/)- 科技、建站、数据库平台、数据湖、视觉智能!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2022-07-24 10:11:52 所属栏目:PHP教程 来源:互联网
导读:在php中数据查询可以分类一维数组查找与多维数组查找了,如果是简单的一维数组我们可以直接使用in_array,array_search 与遍历来实例了,如果是多维数组就需要使用其它办法。 对于一维数组我们可以如下操作: in_array 函数在数组中搜索给定的值,in_array(value,
  在php中数据查询可以分类一维数组查找与多维数组查找了,如果是简单的一维数组我们可以直接使用in_array,array_search 与遍历来实例了,如果是多维数组就需要使用其它办法。
 
  对于一维数组我们可以如下操作:
 
  in_array 函数在数组中搜索给定的值,in_array(value,array,type) type 可选,如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同。
 
  array_key_exists() 函数判断某个数组中是否存在指定的 key,如果该 key 存在,则返回 true,否则返回 false,array_key_exists(key,array)
 
  array_search() 函数与 in_array() 一样,在数组中查找一个键值。如果找到了该值,匹配元素的键名会被返回。如果没找到,则返回 false。array_search(value,array,strict)
 
  从这里来看,在数据量不大的时候,比如小于1000,查找用哪一种都行,都不会成为瓶颈;当数据量比较大的时候,用array_key_exists比较合适,当然这里array_key_exists占用的内存比较大,经测算二分法查找数组是否包含某一元素,兼容正反序,代码实现:
 
  <?php
  $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小元素,代码如下:
 
  <?php
       #随机选择第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<k,说明第i小的元素位于q的左边
               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 "<br>";
       quick_sort($arr, 0, count($arr) - 1);
       print_r($arr);
   ?>
   

(编辑:岳阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读