PHP-求一个php中数组高效搜索算法
假设数组有1000个元素,键值为小于1000000的无序的正整数,且不连续,如下
$arr=array(1=>'sadas',20=>'aasd',5002=>'fghfg',190023=>'rty',248=>'kj',76=>'sddd'...);
现在要获取数组$arr中键的值大于500小于600的元素,不用foreach完全循环一遍的话是否有更高效的算法?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
我写的这个方法,是通过取数组交集的方式,效率和其它方式没有比过,不知道具体怎么样,功能已经测试过通过了。不多说,上代码:
<?php
/**
*获取指定范围下标的数组
*@params $arr 原数组
*@params $start 开始下标
*@params $end 结束下标
*@return 返回指定下标范围的数组
*/
function getByKeyRang($arr, $start, $end){
$return_keys = range($start, $end);
$return_keys = array_flip($return_keys);
return array_intersect_key($arr, $return_keys);
}
//测试
$arr = array(1=>'sadas',20=>'aasd',5002=>'fghfg', 580=>'dfgfdg', 190023=>'rty',248=>'kj',76=>'sddd',606=>'sddd', 505=>'dfgfdg');
var_dump(getByKeyRang($arr, 501, 599));
?>
这个问题本身按需求就是一个键值中键索引范围的获取,直接使用这个就可以了:
当然这个只是针对你的问题需求,如果说键的类型是其他就另当别论
通过正则获取大于500小于600的键的值
ksort($arr);
$arr2=array_keys($aa);
$jstr=json_encode($arr2);
preg_match('/[.*(5d{2}),(.*),([^5]d*),.*]/U',$jstr,$pre);
$resstr=$pre[1].','.$pre[2];
$keyarr=explode(',',$resstr);
当然也可以直接通过正则获取键的值大于500小于600的元素
这个问题不用foreach整个数组,也不存在排序问题,根据数组特性,可以使用下标直接获取元素值:
$result = array();
for($i = 501;$i<600;$i++) {
if(!isset($arr[$i])) continue;
$result[] = $arr[$i];
}
$result 中 便是 大于500小于600的 元素。
可用使用:array_walk(array,function,userdata...),有人比较过,array_walk要比foreach高出43%的效率。
<?php
function myfunction($value,$key)
{
echo "The key $key has the value $value<br />";
}
$arr=array(1=>'sadas',20=>'aasd',5002=>'fghfg',190023=>'rty',248=>'kj',76=>'sddd'...);
array_walk($arr,"myfunction");
?>
参考资料:array_walk 和 foreach, for 的效率的比较