首頁  >  文章  >  後端開發  >  PHP數組合併方法:array_merge VS array_push VS 元素追加

PHP數組合併方法:array_merge VS array_push VS 元素追加

青灯夜游
青灯夜游轉載
2021-07-07 19:13:133709瀏覽

本篇文章跟大家分享三種PHP數組合併方法:array_merge、array_push和元素追加法,並比較一下它們的效能和記憶體消耗。

PHP數組合併方法:array_merge VS array_push VS 元素追加

在PHP 中實作陣列的合併,常用的方法有兩種:

  • 直接使用array_merge ,這種方法雖然做到了程式碼的簡潔,但卻大大增加了記憶體的開銷,同時拖慢了PHP 的效能。
  • 對數組進行遍歷,將數組中的值逐個追加到結果數組中,相較直接使用array_merge ,這種方法雖然增加了代碼量,卻降低了PHP 的內存開銷,同時提升了性能。

⒈ 程式碼實作

/**
    用 PHP 实现将一个二维数组合并为一个一维数组
*/
// 数组的长度
$len = $argv[1];

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

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

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

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

    return $results;
}
// 采用元素追加的方式合并数组
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;

⒉ 運行結果比較

元素追加
#陣列長度 array_merge #array_push
記憶體消耗(B) 運行時間(㎲) 記憶體消耗(B) #運行時間(㎲) 記憶體消耗(B) 運行時間(㎲)
5 432,440 20 #433,200 25 433,200 19
#50 764,704 322 629,736 141 629,736 102
#500 #27,434,944 #897,422 #19,042,416 11,294 19,042,416 8,182
#5,000

3,479,599,5,000

3,479,599,
  • 5,000

    3,479,599,7691922#192#1919,136##。 2,405,853,3921,266,203

    2,405,853,392
  • 1,022,328

    ⒊原因分析使用array_merge ,每呼叫一次,都需要為array_merge 的結果數組分配新的內存空間(PHP 採用的是寫入時複製的機制,而array_merge 不會對參數進行寫入操作,所以每次呼叫時並不需要為入參重新分配記憶體)。隨著陣列長度的增加,呼叫

    array_merge
  • 的次數也會增加,重新分配記憶體的次數也會增加,同時結果陣列的長度不斷增加,每次所需分配的記憶體空間也會隨著增加,這就需要消耗大量的記憶體。同時,頻繁的分配/銷毀內存,導致 PHP 的效能下降。
  • 使用 array_push ,只需要對結果數組分配一次內存,之後會一直往結果數組中追加元素。 PHP 陣列的底層實作方式為

    hashtable
  • ,並且在初始化時會為
hashtable

指派8 個長度的bucket,每個

bucket###儲存一個數組元素。當現有的###bucket### 用完之後,如果還要繼續往數組中追加元素,那麼PHP 會將現有的###bucket### 數量翻倍,所以,使用###array_push ### 往結果陣列中追加元素時,並不是每次操作都需要分配新的###bucket###,這樣就減少了分配記憶體的次數,同時加快了程式運行時間,提升了PHP 效能。 ############使用元素追加的方式,原理與###array_push### 類似,唯一的區別在於使用###array_push### 會有函數調用,而元素追加的方式不需要函數調用,這樣程式運行會更輕。 ############推薦學習:《###PHP影片教學###》###

以上是PHP數組合併方法:array_merge VS array_push VS 元素追加的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除