鍍金池/ 問答/PHP  Python/ php 雙層foreach 如何提升效率

php 雙層foreach 如何提升效率

兩個數(shù)組都是近萬條元素 切都是二維數(shù)組 請問如何優(yōu)化提高效率 php版本 5.3

 foreach ($arrayorser as $key => $value) {
            foreach ($search_order as $k => $v) {
                if ($value['order_id'] == $v['order_id']) {
                    $arr[] = $value;
                }
            }
        }
回答
編輯回答
硬扛

@風(fēng)兮清揚(yáng)

  
        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,測試了你代碼 你的在時(shí)間上相對平穩(wěn) 8.4s 我的在 8.3~8.49s 之間 最后還是采用了你的

2017年7月7日 20:27
編輯回答
莓森

上面幾個回答都只是將你的代碼換了一種寫法,沒什么實(shí)際速度提升。

這個問題是將兩個二維數(shù)組相同數(shù)據(jù)提取出來,這是一個純時(shí)間復(fù)雜度的問題。計(jì)算一下時(shí)間復(fù)雜度,你的代碼是1w * 1w,這是最笨的辦法了,利用PHP數(shù)組的鍵值特性,稍微改造一下,就能達(dá)到1w * 2的效果,看代碼:


// 中間數(shù)組
$_arr = [];

// 建立一個中間數(shù)據(jù)以 order_id 作為鍵
foreach ($search_order as $key => $value) {
    $_arr[$value['order_id']] = [];
}

// 遍歷另一個數(shù)組,執(zhí)行相關(guān)業(yè)務(wù)
foreach ($arrayorser as $key => $value) {
    if (isset($_arr[$value['order_id']])) {
        $_arr[$value['order_id']] = $value;
    }
}

到這里 $_arr 里面的數(shù)據(jù)就和你的一樣了,以order_id為數(shù)組索引。如果想要使用自增數(shù)字作為數(shù)組索引:

$_mix = [];

// 遍歷另一個數(shù)組,執(zhí)行相關(guān)業(yè)務(wù)
foreach ($arrayorser as $key => $value) {
    if (isset($_arr[$value['order_id']])) {
        $_mix[] = $value;
    }
}
2018年7月10日 19:17
編輯回答
傲寒

先對兩個數(shù)組進(jìn)行order_id排序,再遍歷會快一些

2018年7月8日 13:24
編輯回答
絯孑氣

可以分批來處理這幾萬條數(shù)據(jù)嗎?你的服務(wù)器內(nèi)存一下子放那么多數(shù)據(jù),foreach循環(huán)處理可能會報(bào)錯,foreach的時(shí)候最好直接引用數(shù)組地址來操作,即加個&,不要再去拷貝一份數(shù)組了

2018年4月20日 12:11
編輯回答
兔囡囡

給你分析一下:
假如兩個數(shù)組都有1w條,那你兩層foreach要循環(huán)1W*1W=1Y次

給你一個最簡單的方法,只循環(huán)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;
    }
}

去年的回答,看到有人點(diǎn)贊,我就再優(yōu)化了一版,追求更高效率。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,一切利用系統(tǒng)提供的函數(shù)來更高效的完成。

2018年6月11日 22:08
編輯回答
夏木
$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); 
});

我簡單測了下, 時(shí)間比你的少. 你可以試試.

2017年9月8日 09:24
編輯回答
臭榴蓮
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);

試試這個,簡單點(diǎn)好,別搞復(fù)雜的

2017年2月27日 17:05