PHP-求一个php中数组高效搜索算法

发布于 2016-10-26 19:51:19 字数 225 浏览 1305 评论 5

假设数组有1000个元素,键值为小于1000000的无序的正整数,且不连续,如下

$arr=array(1=>'sadas',20=>'aasd',5002=>'fghfg',190023=>'rty',248=>'kj',76=>'sddd'...);

现在要获取数组$arr中键的值大于500小于600的元素,不用foreach完全循环一遍的话是否有更高效的算法?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

泛泛之交 2017-08-30 02:55:19

我写的这个方法,是通过取数组交集的方式,效率和其它方式没有比过,不知道具体怎么样,功能已经测试过通过了。不多说,上代码:

 <?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));
?>

灵芸 2017-07-18 17:24:30

这个问题本身按需求就是一个键值中键索引范围的获取,直接使用这个就可以了:

$arr=array(1=>'sadas',20=>'aasd',5002=>'fghfg',190023=>'rty',248=>'kj',76=>'sddd'...);
$a = 500;$b=600;
array_splice($arr,$a,$b-$a);
print_r($arr);

当然这个只是针对你的问题需求,如果说键的类型是其他就另当别论

夜无邪 2017-04-30 17:02:27

通过正则获取大于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的元素

清晨说ぺ晚安 2017-04-13 01:09:50

这个问题不用foreach整个数组,也不存在排序问题,根据数组特性,可以使用下标直接获取元素值:

$result = array();
for($i = 501;$i<600;$i++) {
if(!isset($arr[$i])) continue;
$result[] = $arr[$i];
}

$result 中 便是 大于500小于600的 元素。

晚风撩人 2017-02-17 19:33:21

可用使用: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 的效率的比较

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文