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

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

代碼如下:$list數(shù)據(jù)量是上千條;$userJobnumberArray大概有幾萬(wàn)條數(shù)據(jù)。但是這種循環(huán)執(zhí)行起來(lái)非常慢,請(qǐng)問(wèn)有什么優(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]);
        }
    }
}
回答
編輯回答
刮刮樂(lè)

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

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

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

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

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

下面這個(gè)如何???能優(yōu)化地方,也就是in_array() 這個(gè) 時(shí)間復(fù)雜度為n的操作變成了 數(shù)組索引調(diào)用這個(gè)復(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萬(wàn)條記錄

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

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

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

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

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

怎么解決?

PHP手冊(cè)中提供了一種 yield 方法

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

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

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

快用上吧~

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

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

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

簡(jiǎn)單的算了下,外面執(zhí)行一千次循環(huán),里面還要執(zhí)行上萬(wàn)次遍歷,這樣肯定耗時(shí)很長(zhǎng),如果一開(kāi)始就把外面的list數(shù)組變?yōu)樽址愋?,然后?duì)里面那個(gè)循環(huán)遍歷的時(shí)候判斷是不是在這個(gè)字符串里面會(huì)不會(huì)好點(diǎn)?!緵](méi)嘗試過(guò),也不敢說(shuō)一定好?!?/p>

2017年5月28日 10:37