鍍金池/ 問答/PHP/ php代碼優(yōu)化建議

php代碼優(yōu)化建議

代碼如下:$list數(shù)據(jù)量是上千條;$userJobnumberArray大概有幾萬條數(shù)據(jù)。但是這種循環(huán)執(zhí)行起來非常慢,請問有什么優(yōu)化的方法?

$list = array(
    '1' => array('1','6','124'),
    '2' => array('2','5','156'),
    '4' => array('4','734','221')
);

$userJobnumberArray = array(
    array(
        'deptid' => '1',
        'jobnumber' => 'X1414'
    ),
    array(
        'deptid' => '734',
        'jobnumber' => '34j6'
    ),
);

$userGroup = array();
foreach ($list as $k => $v) {
    foreach ($userJobnumberArray as $l => $j) {
        if (in_array($j['deptid'], $v)) {
            $userGroup[$k][] = $j['jobnumber'];
            unset($userJobnumberArray[$l]);
        }
    }
}
回答
編輯回答
刮刮樂

$userJobnumberArray 這個為什么不變成map的形式[deptid => jobnumber]?

2017年11月12日 02:11
編輯回答
我甘愿

先拿$list,去重整理成字符串,作為取$userJobnumberArray 的in 條件。幾千個沒什么壓力吧。。。

2017年8月13日 10:40
編輯回答
你的瞳

其實,你只需要先把$userJobnumberArray數(shù)據(jù)的先用一次循環(huán)把他改成$userJobnumberArray=[deptid=>jobnumber] 這個格式,然后在執(zhí)行你的外循環(huán),內(nèi)循環(huán)就不要了,直接判斷 isset($userJobnumberArray[deptid]),如果存在就直接取就好了.

下面這個如何???能優(yōu)化地方,也就是in_array() 這個 時間復(fù)雜度為n的操作變成了 數(shù)組索引調(diào)用這個復(fù)雜度為1的調(diào)用。

<?php

$list = array(
    '1' => array('1','6','124'),
    '2' => array('2','5','156'),
    '4' => array('4','734','221')
);

$userJobnumberArray = array(
    array(
        'deptid' => '1',
        'jobnumber' => 'X1414'
    ),
    array(
        'deptid' => '734',
        'jobnumber' => '34j6'
    ),
);

$ujba = [];

foreach($userJobnumberArray as $v){
    $ujba[$v['deptid']]=$v['jobnumber'];
}
unset($userJobnumberArray);
$userGruop = [];
foreach ($list as $k => $v) {
    foreach($v as $deptid){
        if(isset($ujba[$deptid]))
        $userGruop[$k][] = $ujba[$deptid];
    }
}

print_r($userGruop);
2017年1月21日 06:37
編輯回答
逗婦乳

分批處理

每次處理1萬條記錄

總體耗時其實不比原來少,但是能減少內(nèi)存開銷

2018年7月9日 16:42
編輯回答
神經(jīng)質(zhì)

如果這兩個數(shù)組都來自數(shù)據(jù)庫的話,我建議你優(yōu)化下表結(jié)構(gòu);
如果表結(jié)構(gòu)很難優(yōu)化,那就先優(yōu)化下兩個數(shù)組,然后在匹配吧,畢竟鍵值匹配比in_array快一些;

2018年5月5日 11:34
編輯回答
做不到

畢竟當數(shù)組非常大的時候,數(shù)組是將數(shù)據(jù)一次性加載到內(nèi)存里,這樣內(nèi)存受不了,肯定會出現(xiàn)內(nèi)存溢出這種問題。

怎么解決?

PHP手冊中提供了一種 yield 方法

yield 返回的是依次輸出這些值的一個迭代器。

這種方法的好處是在你處理大數(shù)據(jù)集合的時候不用一次性的加載到內(nèi)存中

也就是說你甚至可以處理無限大的數(shù)據(jù)流。

快用上吧~

2018年9月4日 21:32
編輯回答
厭惡我

用 PHP 協(xié)程
看看社區(qū)的文章,https://segmentfault.com/a/11...

2017年7月5日 18:20
編輯回答
夏夕

簡單的算了下,外面執(zhí)行一千次循環(huán),里面還要執(zhí)行上萬次遍歷,這樣肯定耗時很長,如果一開始就把外面的list數(shù)組變?yōu)樽址愋停缓髮锩婺莻€循環(huán)遍歷的時候判斷是不是在這個字符串里面會不會好點?!緵]嘗試過,也不敢說一定好?!?/p>

2017年5月28日 10:37