php双层foreach,php 双层foreach 如何提升效率

https://segmentfault.com/q/1010000011609822

两个数组都是近万条元素 切都是二维数组 请问如何优化提高效率 php版本 5.3

foreach ($arrayorser as $key => $value) {

foreach ($search_order as $k => $v) {

if ($value['order_id'] == $v['order_id']) {

$arr[] = $value;

}

}

}

阅读 4.9k 赞 2踩 收藏 17关注 18评论  发布于 2017-10-18操作举报

1d3176d1fabbc76fa5fd80fcfe2cba5e.png

c25a0bd7faa908de4e14af4379f5b183.gif

3.3k

$search_order_ids = array_map(function ($o) {

return $o['order_id'];

}, $search_order);

$arr = array_filter($arrayorser, function ($o) use ($search_order_ids) {

return in_array($o['order_id'], $search_order_ids);

});

我简单测了下, 时间比你的少. 你可以试试. 赞 已采纳评论赞赏发布于 2017-10-18zhangsan

593

给你分析一下:

假如两个数组都有1w条,那你两层foreach要循环1W*1W=1Y次

给你一个最简单的方法,只循环1w次就够了。

$search_order_id_arr=array_unique(array_column($search_order,'order_id'));

foreach ($arrayorser as $key => $value) {

if(in_array($value['order_id'],$search_order_id_arr)){

$arr[] = $value;

}

}

去年的回答,看到有人点赞,我就再优化了一版,追求更高效率。2018-01-12

$search_order_id_arr=array_unique(array_column($search_order,'order_id'));

$arr=array_filter($arrayorser,function($value)use($search_order_id_arr){

return in_array($value['order_id'],$search_order_id_arr);

});

不需要任何foreach,一切利用系统提供的函数来更高效的完成。 赞 3评论赞赏更新于 2018-01-12

zZzz: 你好,请问下假如我得代码是这样的,怎么能优化呢。

foreach ($arrayorser as $key => $value) {foreach ($search_order as $k => $v) {

if ($value['order_id'] == $v['order_id']) {

$arrayorser[$key]['XXX'] = $v['xxx'];

}

}}就是相当于双foreach,然后把相同键的赋给第一个数组 回复  2019-08-16

614

上面几个回答都只是将你的代码换了一种写法,没什么实际速度提升。

这个问题是将两个二维数组相同数据提取出来,这是一个纯时间复杂度的问题。计算一下时间复杂度,你的代码是1w * 1w,这是最笨的办法了,利用PHP数组的键值特性,稍微改造一下,就能达到1w * 2的效果,看代码:

// 中间数组

$_arr = [];

// 建立一个中间数据以 order_id 作为键

foreach ($search_order as $key => $value) {

$_arr[$value['order_id']] = [];

}

// 遍历另一个数组,执行相关业务

foreach ($arrayorser as $key => $value) {

if (isset($_arr[$value['order_id']])) {

$_arr[$value['order_id']] = $value;

}

}

到这里 $_arr 里面的数据就和你的一样了,以order_id为数组索引。如果想要使用自增数字作为数组索引:

$_mix = [];

// 遍历另一个数组,执行相关业务

foreach ($arrayorser as $key => $value) {

if (isset($_arr[$value['order_id']])) {

$_mix[] = $value;

}

}

yc8332: 你确定别人的答案没有速度的提升? 回复  2017-10-18

路易港: 代码跑一下就知道咯 回复  2017-10-18

DullCat: 这同样循环了两个数组啊,依旧是1W*1w啊 回复  2017-12-28

路易港: 理解清楚哦,是2*1W,不是1W*1W 回复  2017-12-30

1.1k

foreach ($search_order as $value){

$search_order_new[$value['order_id']] = $value;

}

foreach ($arrayorser as $value){

$arrayorser_new[$value['order_id']] = $value;

}

$result = array_intersect_key($arrayorser_new, $search_order_new);

试试这个,简单点好,别搞复杂的 赞 1评论赞赏发布于 2017-10-18

VictorWang: 这个简单,效率比其他几个都要高。 回复  2018-07-31

42

foreach ($arrayorser as $key=> $value){

$ser[] = $value['order_id'];

}

foreach ($search_order as $k=>$v){

$sers[] = $v['order_id'];

}

foreach ($ser as $key=> $item){

if(in_array($item,$sers)){

$arr[$key]['order_id'] = $item;

}

}

这是我写的很low,测试了你代码 你的在时间上相对平稳 8.4s 我的在 8.3~8.49s 之间 最后还是采用了你的 赞评论赞赏更新于 2017-10-18滩谷云

182

可以分批来处理这几万条数据吗?你的服务器内存一下子放那么多数据,foreach循环处理可能会报错,foreach的时候最好直接引用数组地址来操作,即加个&,不要再去拷贝一份数组了 赞评论赞赏发布于 2017-10-21trycatchfinal

15

先对两个数组进行order_id排序,再遍历会快一些

php 双层foreach 如何提升效率

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值