Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种优雅的方法可以在PHP中链接数组?_Php_Arrays - Fatal编程技术网

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

有没有一种优雅的方法可以在PHP中链接数组?,php,arrays,Php,Arrays,我是说喜欢 目标 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); } 实际上,我不太喜欢调用用户函数数组,也不太喜欢f

我是说喜欢

目标

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);
}
实际上,我不太喜欢调用用户函数数组,也不太喜欢foreach,所以我被困在这里。

这是怎么回事:

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

这是一个没有调用用户函数数组和foreach数组的三行程序:

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

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

    return $return;
}
实际上是这样。

$input=[[a'、[b']、[c'、[d'、[e']、[f'、[g'、[h'、[i'];
函数测试调用($input)
{
返回调用用户函数数组('array\u merge',$input);
}
功能测试\u foreach($input)
{
$result=[];
foreach($input作为$array){
foreach($array作为$value){
$result[$value]=true;
}
}
返回数组_键($result);
}
功能测试减少($input)
{
返回array_reduce($input,'array_merge',[]);
}
$start=microtime(真);
对于($i=0;$i<1e5;++$i){
测试调用($input);
}
变量转储(微时间(真)-$start);
$start=microtime(真);
对于($i=0;$i<1e5;++$i){
每个测试单元($input);
}
变量转储(微时间(真)-$start);
$start=microtime(真);
对于($i=0;$i<1e5;++$i){
测试减少(投入);
}
变量转储(微时间(真)-$start);
结果

调用用户函数数组-双精度(0.56941080093384)
foreach-双精度(0.70889902114868)

array\u reduce-double(0.76243710517883)

使用array\u push如何?请参阅下面的RMY初学者不需要考虑给定的输入,ArayyPube会考虑两个前缀):所以重申一下,你不喜欢一个语言结构,它允许你执行迭代,你不喜欢你提出的解决方案。我是否遗漏了一些东西,或者我们编写代码纯粹是为了炫耀我们的代码基于hipster标准有多漂亮?如果PHP真的用错误的方式来摩擦你,我会考虑完全替换Python,而忽略PHP作为一种语言。一个程序员应该能够把“丑陋”的解决方案变成美丽的解决方案(美丽是随意的)。@N.B:我认为你想得太多了!!OP只需要一个等效的解决方案/方法…冷静点!!:)这难道不是一个比问题已经显示的更糟糕的版本吗?@Jon好吧,这是一个意见的问题,是否更糟。。。OP要求另一种解决方案,结果是。。。如果你认为你有一个更好的,你可以发布它…:)@克莱米:我不会对答案投反对票,所以假设我在这个问题上投了-1票,这不是关于替代方案,而是关于更好的替代方案!!:)我使用“更差”的意思是,它非常接近原始版本,但涉及到一个实际上并不需要的附加函数(
array\u reduce
)。做更多的工作以获得相同的结果,但没有附加值。@NoobEditor谢谢,你真好:)但是,我不明白这个答案有什么问题。。。当然,它使用的方法与OP提出的方法非常相似,但它使用的逻辑不同。。。真正的问题是OP不喜欢调用call_user_func_数组(我不知道为什么)或foreach循环,所以我提出了一个函数,它既不使用call_user_func_数组,也不使用foreach循环。。。就这样!如果你能做得更好,再次发布你的答案,我会投票给你问题是我没有把数组放在单独的变量中,而是放在一个数组中,我不知道我有多少。这种测试的结果可能取决于数组的数量和每个数组中的值的数量。我也不是在寻找一个快速的解决方案,那些时间是可以忽略的,我是在寻找一个可读/优雅的解决方案。
$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);