我的意思是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
的忠实粉丝,所以我被困在这里。
答案 0 :(得分:1)
这个怎么样:
function chain($array_of_arrays)
{
return array_reduce($array_of_arrays,'array_merge',array());
}
答案 1 :(得分:0)
这是一个没有call_user_func_array
和foreach
的<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)