Cet article partagera avec vous trois méthodes de fusion de tableaux PHP : array_merge, array_push et la méthode element append, et comparera leurs performances et leur consommation de mémoire.
Pour implémenter la fusion de tableaux en PHP, il existe deux méthodes couramment utilisées :
⒈ Implémentation du code
/** 用 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;
⒉ Comparaison des résultats d'exécution
数组长度 | 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,136 | 904,476,129 | 2,405,853,392 | 1,266,203 | 2,405,853,392 | 1,022,328 |
⒊ Analyse des causes
Utiliser array_merge
, à chaque fois appelé, un nouvel espace mémoire doit être alloué pour le tableau de résultats de array_merge
(PHP utilise un mécanisme de copie sur écriture et array_merge
n'écrit pas de paramètres, donc chaque appel Il n'est pas nécessaire de réallouer de la mémoire pour les paramètres d'entrée). À mesure que la longueur du tableau augmente, le nombre d'appels à array_merge
augmentera également, et le nombre de réallocations de mémoire augmentera également. Dans le même temps, la longueur du tableau résultat continuera d'augmenter. , et l'espace mémoire qui doit être alloué à chaque fois augmentera également à mesure qu'il augmente, il consomme beaucoup de mémoire. Dans le même temps, l’allocation/destruction fréquente de mémoire entraîne une dégradation des performances de PHP. 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
array_push
, vous n'avez besoin d'allouer de la mémoire au tableau de résultats qu'une seule fois, puis les éléments seront ajoutés au tableau de résultats. L'implémentation sous-jacente du tableau PHP est hashtable
, et lors de l'initialisation, hashtable
se verra attribuer 8 longueurs de bucket
, chaque bucket code> Stocke un élément du tableau. Lorsque le <code>bucket
existant est épuisé, si vous continuez à ajouter des éléments au tableau, PHP doublera le nombre de bucket
existant, utilisez donc array_push
Lors de l'ajout d'éléments au tableau de résultats, toutes les opérations n'ont pas besoin d'allouer un nouveau bucket
, ce qui réduit le nombre d'allocations de mémoire, accélère le temps d'exécution du programme et améliore les performances PHP. Le principe de l'ajout d'éléments est similaire à array_push
. La seule différence est qu'il y aura des appels de fonction lors de l'utilisation de array_push
, alors que la méthode d'ajout d'éléments ne le fait pas. nécessitent des appels de fonction. De cette façon, le programme fonctionnera de manière plus légère. 🎜🎜🎜🎜Apprentissage recommandé : "🎜Tutoriel vidéo PHP🎜"🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!