在PHP中是否有一种优雅的方法来链接(扁平化)数组?[副本]

oknwwptz  于 2023-05-05  发布在  PHP
关注(0)|答案(3)|浏览(135)

此问题已在此处有答案

How to Flatten a Multidimensional Array?(31答案)
2天前关闭。
我是说就像Python的链子。

目标

chain([['a', 'b'], ['c', 'd', 'e'], ['f', 'g', 'h', 'i']]);
["a","b","c","d","e","f","g","h","i"]

实际使用但不愉快的解决方案

function chain($array_of_arrays)
{
    return call_user_func_array('array_merge', $array_of_arrays);
}

其实我不是call_user_func_array的粉丝,也不是foreach的粉丝,所以我只能停留在这里了。

cpjpxq1n

cpjpxq1n1#

这个怎么样:

function chain($array_of_arrays)
{
    return array_reduce($array_of_arrays,'array_merge',array());
}
dfddblmv

dfddblmv2#

下面是一个没有call_user_func_arrayforeach的三行程序:

function chain($array)
{
    $return = [];

    array_walk_recursive($array, function($x) use (&$return) { $return[] = $x; });

    return $return;
}

Laravel就是这么做的。

sq1bmfud

sq1bmfud3#

$input = [['a', 'b'], ['c', 'd', 'e'], ['f', 'g', 'h', 'i']];

function test_call($input)
{
    return call_user_func_array('array_merge', $input);
}

function test_foreach($input)
{
    $result = [];

    foreach ($input as $array) {
        foreach ($array as $value) {
            $result[$value] = true;
        }
    }

    return array_keys($result);
}

function test_reduce($input)
{
    return array_reduce($input, 'array_merge', []);
}

$start = microtime(true);
for ($i = 0; $i < 1e5; ++$i) {
    test_call($input);
}
var_dump(microtime(true) - $start);

$start = microtime(true);
for ($i = 0; $i < 1e5; ++$i) {
    test_foreach($input);
}
var_dump(microtime(true) - $start);

$start = microtime(true);
for ($i = 0; $i < 1e5; ++$i) {
    test_reduce($input);
}
var_dump(microtime(true) - $start);

结果
call_user_func_array - double(0.56941080093384)
foreach - double(0.70889902114868)
array_reduce - double(0.76243710517883)

相关问题