【问题标题】:Is there an elegant way to chain arrays in PHP? [closed]有没有一种优雅的方式在 PHP 中链接数组? [关闭]
【发布时间】:2014-07-15 09:49:19
【问题描述】:

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

【问题讨论】:

  • 使用array_push怎么样?看这里armantutorial.wordpress.com/2014/07/02/…
  • @rm_beginners 考虑到给定的输入,array_push 不会需要 foreach 吗?
  • array_push 会考虑两个 foreach )o:
  • 所以重申一下,您不喜欢旨在允许您执行迭代的语言结构,您不喜欢您提出的可行的解决方案。我是否遗漏了什么,或者我们是否纯粹编码以便我们可以吹嘘我们的代码基于时髦标准有多漂亮?如果碰巧 PHP 真的以错误的方式惹恼你,我会考虑完全换成 Python 并简单地忽略 PHP 作为一门语言。程序员应该能够将“丑陋”的解决方案变成漂亮的解决方案(美丽在这里是任意的)。
  • @N.B. : 我觉得你想太多了!! OP 只想要一个 等效 解决方案/方法……冷静! :)

标签: php arrays


【解决方案1】:

这个呢:

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

【讨论】:

  • 这不是比问题已经显示的更糟糕的版本吗?
  • @Jon 好吧,它是否更糟是一个见仁见智的问题...... OP 要求提供替代解决方案,它就是......如果你认为你有更好的解决方案,你可以发布它... :)
  • @clami : 我不反对答案,所以 assume 我对此做了 -1,这不是关于 alternative solution 而是关于 更好的替代解决方案!! :)
  • 我使用了“更糟糕”,因为它非常接近原始版本,但涉及一个并非真正需要的附加功能 (array_reduce)。做更多的工作以获得相同的结果而没有附加值。
  • @NoobEditor 谢谢,你真好 :) 但是,我仍然不明白这个答案有什么问题......当然,它使用的方法与提议的方法非常相似由 OP 提出,但它使用了不同的逻辑……真正的一点是 OP 不喜欢调用 call_user_func_array (我不知道为什么)或 foreach 循环,所以我提出了一个不使用的函数。 .. 就是这样!如果您能做得更好,请再次发布您的答案,我会为您投票! :)
【解决方案2】:

这是一个没有 call_user_func_arrayforeach 的 3 行:

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

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

    return $return;
}

实际上是how Laravel does it

【讨论】:

    【解决方案3】:
    $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 - 双倍(0.70889902114868)
    array_reduce - double(0.76243710517883)

    【讨论】:

    • 问题是我的数组不是在单独的变量中而是在一个数组中,我不知道我有多少。
    • 薄型测试的结果可能取决于数组的数量和每个数组中的值的数量。另外我不是在寻找一个快速的解决方案,那些时间可以忽略不计,我正在寻找一个可读/优雅的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2020-01-09
    • 2017-01-25
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 2011-09-18
    • 1970-01-01
    相关资源
    最近更新 更多