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操作舉報
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 如何提升效率
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的php双层foreach,php 双层foreach 如何提升效率的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php no input file sp
- 下一篇: PHP网站如何搬迁,如何搬迁DedeCM