欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

PHP数组合并方法:array_merge VS array_push VS 元素追加

程序员文章站 2022-03-06 07:53:56
...
本篇文章给大家分享三种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,136 904,476,129 2,405,853,392 1,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 元素追加的详细内容,更多请关注其它相关文章!