Maison  >  Article  >  développement back-end  >  Méthode de fusion de tableaux PHP : array_merge VS array_push VS ajout d'élément

Méthode de fusion de tableaux PHP : array_merge VS array_push VS ajout d'élément

青灯夜游
青灯夜游avant
2021-07-07 19:13:133683parcourir

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.

Méthode de fusion de tableaux PHP : array_merge VS array_push VS ajout d'élément

Pour implémenter la fusion de tableaux en PHP, il existe deux méthodes couramment utilisées :

  • Utilisez directement array_merge. Bien que cette méthode garde le code simple, elle augmente considérablement la surcharge de mémoire et ralentit les performances du processus PHP.
  • Parcourez le tableau et ajoutez les valeurs du tableau au tableau de résultats une par une. Par rapport à l'utilisation directe de array_merge, bien que cette méthode augmente la quantité de code, elle réduit la surcharge de mémoire de PHP et améliore les performances.

⒈ 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

En utilisant 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer