日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

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

發布時間:2024/1/23 php 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 如何提升效率的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。