本篇文章跟大家分享三種PHP數組合併方法:array_merge、array_push和元素追加法,並比較一下它們的效能和記憶體消耗。
在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 |
3,479,599,5,000
3,479,599,3,479,599,
7691922#192#1919,136##。
2,405,853,392
1,266,203
⒊原因分析
使用
array_merge
,每呼叫一次,都需要為array_merge
的結果數組分配新的內存空間(PHP 採用的是寫入時複製的機制,而array_merge
不會對參數進行寫入操作,所以每次呼叫時並不需要為入參重新分配記憶體)。隨著陣列長度的增加,呼叫
使用
array_push
,只需要對結果數組分配一次內存,之後會一直往結果數組中追加元素。 PHP 陣列的底層實作方式為
指派8 個長度的bucket,每個
bucket###儲存一個數組元素。當現有的###bucket### 用完之後,如果還要繼續往數組中追加元素,那麼PHP 會將現有的###bucket### 數量翻倍,所以,使用###array_push ### 往結果陣列中追加元素時,並不是每次操作都需要分配新的###bucket###,這樣就減少了分配記憶體的次數,同時加快了程式運行時間,提升了PHP 效能。 ############使用元素追加的方式,原理與###array_push### 類似,唯一的區別在於使用###array_push### 會有函數調用,而元素追加的方式不需要函數調用,這樣程式運行會更輕。 ############推薦學習:《###PHP影片教學###》###以上是PHP數組合併方法:array_merge VS array_push VS 元素追加的詳細內容。更多資訊請關注PHP中文網其他相關文章!