溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP數(shù)組合并方法有哪些

發(fā)布時(shí)間:2021-07-08 10:04:31 來(lái)源:億速云 閱讀:135 作者:小新 欄目:編程語(yǔ)言

這篇文章主要介紹PHP數(shù)組合并方法有哪些,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

給大家分享三種PHP數(shù)組合并方法:array_merge、array_push和元素追加法,并比較一下它們的性能和內(nèi)存消耗。

在 PHP 中實(shí)現(xiàn)數(shù)組的合并,常用的方法有兩種:

  • 直接使用 array_merge ,這種方法雖然做到了代碼的簡(jiǎn)潔,但卻大大增加了內(nèi)存的開銷,同時(shí)拖慢了 PHP 的性能。

  • 對(duì)數(shù)組進(jìn)行遍歷,將數(shù)組中的值逐個(gè)追加到結(jié)果數(shù)組中,相較直接使用 array_merge ,這種方法雖然增加了代碼量,卻降低了 PHP 的內(nèi)存開銷,同時(shí)提升了性能。

⒈ 代碼實(shí)現(xiàn)

/**
    用 PHP 實(shí)現(xiàn)將一個(gè)二維數(shù)組合并為一個(gè)一維數(shù)組
*/
// 數(shù)組的長(zhǎng)度
$len = $argv[1];

$start = 0;
$arr = [];
// 數(shù)組初始化
while ($start < $len) {
    $arr[$start] = range(1, $len);
    $start ++;
}
// 采用 array_merge 的方式合并數(shù)組
function merge1 (array $input)
{
    $results = [];

    foreach ($input as $item) {
        $results = array_merge($results, $item);
    }

    return $results;
}
// 采用 array_push 的方式合并數(shù)組
function merge2 (array $input) 
{
    $results = [];

    foreach ($input as $item) {
        foreach ($item as $v) {
            array_push($results, $v);
        }
    }

    return $results;
}
// 采用元素追加的方式合并數(shù)組
function merge3(array $input)
{
    $results = [];

    foreach ($input as $item) {
        foreach ($item as $v) {
            $results [] = $v;
        }
    }

    return $results;
}

echo microtime(), PHP_EOL;
$res = merge3($arr);
echo microtime(), PHP_EOL;

echo memory_get_usage(), PHP_EOL;
echo memory_get_peak_usage(), PHP_EOL;

⒉ 運(yùn)行結(jié)果比較

數(shù)組長(zhǎng)度array_mergearray_push元素追加
內(nèi)存消耗(B)運(yùn)行時(shí)間(?)內(nèi)存消耗(B)運(yùn)行時(shí)間(?)內(nèi)存消耗(B)運(yùn)行時(shí)間(?)
5432,44020433,20025433,20019
50764,704322629,736141629,736102
50027,434,944897,42219,042,41611,29419,042,4168,182
5,0003,479,599,136904,476,1292,405,853,3921,266,2032,405,853,3921,022,328

⒊ 原因分析

  • 使用 array_merge ,每調(diào)用一次,都需要為 array_merge 的結(jié)果數(shù)組分配新的內(nèi)存空間(PHP 采用的是寫時(shí)復(fù)制的機(jī)制,而 array_merge 不會(huì)對(duì)參數(shù)進(jìn)行寫操作,所以每次調(diào)用時(shí)并不需要為入?yún)⒅匦路峙鋬?nèi)存)。隨著數(shù)組長(zhǎng)度的增加,調(diào)用 array_merge 的次數(shù)也會(huì)增加,重新分配內(nèi)存的次數(shù)也會(huì)增加,同時(shí)結(jié)果數(shù)組的長(zhǎng)度不斷增加,每次所需要分配的內(nèi)存空間也會(huì)隨著增加,這就需要消耗大量的內(nèi)存。同時(shí),頻繁的分配/銷毀內(nèi)存,導(dǎo)致 PHP 的性能下降。

  • 使用 array_push ,只需要對(duì)結(jié)果數(shù)組分配一次內(nèi)存,之后會(huì)一直往結(jié)果數(shù)組中追加元素。PHP 數(shù)組的底層實(shí)現(xiàn)方式為 hashtable,并且在初始化時(shí)會(huì)為 hashtable 分配 8 個(gè)長(zhǎng)度的 bucket,每個(gè) bucket 存儲(chǔ)一個(gè)數(shù)組元素。當(dāng)現(xiàn)有的 bucket 用完之后,如果還要繼續(xù)往數(shù)組中追加元素,那么 PHP 會(huì)將現(xiàn)有的 bucket 數(shù)量翻倍,所以,使用 array_push 往結(jié)果數(shù)組中追加元素時(shí),并不是每次操作都需要分配新的 bucket,這樣就減少了分配內(nèi)存的次數(shù),同時(shí)加快了程序運(yùn)行時(shí)間,提升了 PHP 性能。

  • 使用元素追加的方式,原理與 array_push 類似,唯一的區(qū)別在于使用 array_push 會(huì)有函數(shù)調(diào)用,而元素追加的方式不需要函數(shù)調(diào)用,這樣程序運(yùn)行會(huì)更輕量。

以上是“PHP數(shù)組合并方法有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI