這篇文章主要介紹PHP數(shù)組合并方法有哪些,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
10年積累的成都網(wǎng)站制作、網(wǎng)站建設、外貿(mào)網(wǎng)站建設經(jīng)驗,可以快速應對客戶對網(wǎng)站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡服務。我雖然不認識你,你也不認識我。但先做網(wǎng)站設計后付款的網(wǎng)站建設流程,更有宜賓免費網(wǎng)站建設讓你可以放心的選擇與我們合作。
給大家分享三種PHP數(shù)組合并方法:array_merge、array_push和元素追加法,并比較一下它們的性能和內(nèi)存消耗。
在 PHP 中實現(xiàn)數(shù)組的合并,常用的方法有兩種:
直接使用 array_merge ,這種方法雖然做到了代碼的簡潔,但卻大大增加了內(nèi)存的開銷,同時拖慢了 PHP 的性能。
對數(shù)組進行遍歷,將數(shù)組中的值逐個追加到結(jié)果數(shù)組中,相較直接使用 array_merge ,這種方法雖然增加了代碼量,卻降低了 PHP 的內(nèi)存開銷,同時提升了性能。
⒈ 代碼實現(xiàn)
/** 用 PHP 實現(xiàn)將一個二維數(shù)組合并為一個一維數(shù)組 */ // 數(shù)組的長度 $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;
⒉ 運行結(jié)果比較
數(shù)組長度 | array_merge | array_push | 元素追加 | |||
內(nèi)存消耗(B) | 運行時間(?) | 內(nèi)存消耗(B) | 運行時間(?) | 內(nèi)存消耗(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,136 | 904,476,129 | 2,405,853,392 | 1,266,203 | 2,405,853,392 | 1,022,328 |
⒊ 原因分析
使用 array_merge
,每調(diào)用一次,都需要為 array_merge
的結(jié)果數(shù)組分配新的內(nèi)存空間(PHP 采用的是寫時復制的機制,而 array_merge
不會對參數(shù)進行寫操作,所以每次調(diào)用時并不需要為入?yún)⒅匦路峙鋬?nèi)存)。隨著數(shù)組長度的增加,調(diào)用 array_merge
的次數(shù)也會增加,重新分配內(nèi)存的次數(shù)也會增加,同時結(jié)果數(shù)組的長度不斷增加,每次所需要分配的內(nèi)存空間也會隨著增加,這就需要消耗大量的內(nèi)存。同時,頻繁的分配/銷毀內(nèi)存,導致 PHP 的性能下降。
使用 array_push
,只需要對結(jié)果數(shù)組分配一次內(nèi)存,之后會一直往結(jié)果數(shù)組中追加元素。PHP 數(shù)組的底層實現(xiàn)方式為 hashtable
,并且在初始化時會為 hashtable
分配 8 個長度的 bucket
,每個 bucket
存儲一個數(shù)組元素。當現(xiàn)有的 bucket
用完之后,如果還要繼續(xù)往數(shù)組中追加元素,那么 PHP 會將現(xiàn)有的 bucket
數(shù)量翻倍,所以,使用 array_push
往結(jié)果數(shù)組中追加元素時,并不是每次操作都需要分配新的 bucket
,這樣就減少了分配內(nèi)存的次數(shù),同時加快了程序運行時間,提升了 PHP 性能。
使用元素追加的方式,原理與 array_push
類似,唯一的區(qū)別在于使用 array_push
會有函數(shù)調(diào)用,而元素追加的方式不需要函數(shù)調(diào)用,這樣程序運行會更輕量。
以上是“PHP數(shù)組合并方法有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!