热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

在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占用的内存比较大,经测算二分法查找数组是否包含某一元素,兼容正反序,代码实现:

  1. $searchValue = (int)$_GET['key']; 
  2. function search(array $array$value
  3. $max = count($array)-1; 
  4. $min = 0; 
  5. $isAscSort = $array[$min] < $array[$max]; 
  6. while (TRUE) { 
  7. $sum = $min+$max
  8. $midKey = (int)($sum%2 == 1 ? ceil($sum/2) : $sum/2); 
  9. if ($max < $min) { 
  10. return -1; 
  11. else if ($value == $array[$midKey]) { 
  12. return 1; 
  13. else if ($value > $array[$midKey]) { 
  14. $isAscSort ? $min = $midKey+1 : $max = $midKey-1; 
  15. else if ($value < $array[$midKey]) { 
  16. $isAscSort ? $max = $midKey-1 : $min = $midKey+1; 
  17. $array = array
  18. &#39;4&#39;&#39;5&#39;&#39;7&#39;&#39;8&#39;&#39;9&#39;&#39;10&#39;&#39;11&#39;&#39;12&#39; 
  19. ); 
  20. // 正序 
  21. echo search($array$searchValue); 
  22. // 逆序 
  23. rsort($array); 
  24. echo search($array$searchValue); 

例二,PHP 查找数组第i小元素,代码如下:

  1.      #随机选择第i小的数字,用随机快排实现 
  2.       
  3.      #交换元素 
  4.      function swap(&$arr$i$j) { 
  5.          $temp = $arr[$i]; 
  6.          $arr[$i] = $arr[$j]; 
  7.          $arr[$j] = $temp
  8.      } 
  9.  
  10.      #随机划分 
  11.      function randomized_partition(&$arr$begin$end) { 
  12.          $rand_inx = rand($begin$end); 
  13.          swap($arr$begin$rand_inx); 
  14.          return partition($arr$begin$end); 
  15.      } 
  16.  
  17.      #划分 
  18.      function partition(&$arr$begin$end) { 
  19.          #以第一个元素作为中枢元素 
  20.          $pivot = $begin
  21.          $low = $begin
  22.          $high = $end
  23.  
  24.          while ($low < $high) { 
  25.              while ($low < $high && $arr[$low] <= $arr[$pivot]) { 
  26.                  $low++; 
  27.              } 
  28.  
  29.              while ($low < $high && $arr[$high] >= $arr[$pivot]) { 
  30.                  $high--; 
  31.              } 
  32.  
  33.              swap($arr$low$high); 
  34.          } 
  35.  
  36.          #交换中枢元素 
  37.          if ($arr[$pivot] < $arr[$low]) { 
  38.              $low--; 
  39.          } 
  40.          swap($arr$pivot$low); 
  41.          return $low
  42.      } 
  43.  
  44.      #快速排序,此处没用到 
  45.      function quick_sort(&$arr$begin$end) { 
  46.          $q = randomized_partition($arr$begin$end); 
  47.          if ($q > $begin) { 
  48.              quick_sort($arr$begin$q - 1); 
  49.          } 
  50.          if ($q < $end) { 
  51.              quick_sort($arr$q + 1, $end); 
  52.          } 
  53.      } 
  54.  
  55.      #选取第i小的数 
  56.      function randomized_select(&$arr$begin$end$i) { 
  57.          if ($begin == $end) { 
  58.              return $arr[$begin]; 
  59.          } 
  60.  
  61.          $q = randomized_partition($arr$begin$end); 
  62.          $k = $q - $begin + 1; #k代表小于等于q的元素个数 
  63.  
  64.          if ($k == $i) { #如果k=i,说明q就是第i小的元素坐标 
  65.              return $arr[$q]; 
  66.          } else if ($i < $k) { #如果i
  67.              return randomized_select($arr$begin$q - 1, $i); 
  68.          } else { #第i小的元素位于q的右边,此时查找右边的第i-k小的元素 
  69.              return randomized_select($arr$q + 1, $end$i - $k); 
  70.          } 
  71.      } 
  72.  
  73.      $arr = array(1, 5, 3, 7, 0, 0, 8, 4, 2, 9, 11); 
  74.      $t = randomized_select($arr, 0, count($arr) - 1, 8); 
  75.      print_r("The 8th minimum element: {$t}"); 
  76.      echo "
    "
  77.      quick_sort($arr, 0, count($arr) - 1); 
  78.      print_r($arr); 
  79.  ?>

推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 橱窗设计的表现手法及其应用
    本文介绍了橱窗设计的表现手法,包括直接展示、寓意与联想、夸张与幽默等。通过对商品的折、拉、叠、挂、堆等陈列技巧,橱窗设计能够充分展现商品的形态、质地、色彩、样式等特性。同时,寓意与联想可以通过象形形式或抽象几何道具来唤起消费者的联想与共鸣,创造出强烈的时代气息和视觉空间。合理的夸张和贴切的幽默能够明显夸大商品的美的因素,给人以新颖奇特的心理感受,引起人们的笑声和思考。通过这些表现手法,橱窗设计能够有效地传达商品的个性内涵,吸引消费者的注意力。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • faceu激萌变老特效的使用方法详解
    本文介绍了faceu激萌变老特效的使用方法,包括打开faceu激萌app、点击贴纸、选择热门贴纸中的变老特效,然后对准人脸进行拍摄,即可给照片添加变老特效。操作简单,适合新用户使用。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 大连微软技术社区举办《.net core始于足下》活动,获得微软赛百味和易迪斯的赞助
    九月十五日,大连微软技术社区举办了《.net core始于足下》活动,共有51人报名参加,实际到场人数为43人,还有一位专程从北京赶来的同学。活动得到了微软赛百味和易迪斯的赞助,场地也由易迪斯提供。活动中大家积极交流,取得了非常成功的效果。 ... [详细]
  • 给定一个二叉树,要求随机选择树上的一个节点。解法:遍历树的过程中,随机选择一个节点即可。具体做法参看:从输入 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了在微店中如何修改分销产品的价格以及设置价格的方法。客户在拍下商品后,在1小时内可以进行修改价格的操作,通过进入订单管理,点击未付款子项,可以找到订单信息并进行改价操作。修改价格后,买家会收到改价后的短信通知,在微店订单中进行付款即可。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
author-avatar
txwd2008
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有