在PHP中链接数组有一种优雅的方法吗?

时间:2014-07-15 09:49:20

标签: php arrays

我的意思是python's chain

目标

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的忠实粉丝,所以我被困在这里。

3 个答案:

答案 0 :(得分:1)

这个怎么样:

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

答案 1 :(得分:0)

这是一个没有call_user_func_arrayforeach的<3-liner:

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

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

    return $return;
}

实际上是how Laravel does it

答案 2 :(得分:0)

$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)