【问题标题】:How to merge multiple arrays in PHP but mix values together - retaining their order如何在 PHP 中合并多个数组但将值混合在一起 - 保留它们的顺序
【发布时间】:2017-03-22 02:39:27
【问题描述】:

在 PHP 中是否有一种直接的方法可以将多个数组组合在一起但尊重元素的相对顺序?

例如,如果我有两个数组

$x = ('1','2','3','4');

$y = array('a','b','c','d','e');

我想将它们组合成一个数组

$z = ('1','a','2','b','3','c','4','d','e');

有没有一种简单的方法可以做到这一点?理想的解决方案还可以考虑不同长度的数组,就像我的示例一样。

array_merge 似乎没有达到我想要的效果,因为它只是将一个数组附加到另​​一个数组。

我当前的解决方案按顺序循环遍历每个数组并将值推送到我的 $z 数组。这不仅不优雅,还要求输入数组具有相同数量的值,这对我的应用程序来说并不理想。

任何见解将不胜感激

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    从 0 迭代到两个数组的较大长度。 在每一步,如果数组 $x 包含索引处的项目,则将其推送到最终数组 $z。对数组 $y 执行相同操作。

    【讨论】:

    • 提问者已经这样做了"....我当前的解决方案按顺序循环遍历每个数组并将值推送到我的 $z 数组"。您能指出您想到的更好的解决方案吗?
    • 他说他执行了两个循环,每个数组一个。我的建议是只循环一次
    【解决方案2】:

    我认为这应该可行 -

    $count = max(count($x), count($y));
    
    $newArr = array();
    for ($i = 0; $i < $count; $i++) {
      // enter values to the new array based on key
      foreach(array($x, $y) as $arr) {
        if (isset($arr[$i])) {
          $newArr[] = $arr[$i];
        }
      }
    }
    
    var_dump($newArr);
    

    【讨论】:

    • 这不起作用的原因有很多:foreach 之后没有左括号,而是一个右括号,$newArr 声明为array,但在循环中用作string等。请在发布之前测试您的代码。
    • 当然,答案是在我写评论时编辑的……该死!它现在有效,已删除反对票。
    • 内循环每次$i迭代执行两次,这与我们分别编写$x和$y的检查相同。
    【解决方案3】:

    你也可以试试这个

    $x = array('1','2','3','4');
    $y = array('a','b','c','d','e');
    foreach($y as $key=>$value){
        if($x[$key]){
         $z[] = $x[$key];
         $z[] =     $value;
    
        }else {
            $z[] = $value;      
        }
    }
    

    【讨论】:

      【解决方案4】:

      你可以使用这个通用函数,它可以接受任意数量的数组,并会输出一个数组,其中的元素首先取自第一个“列”,然后取自第二个,依此类推:

      function mix_merge(...$args) {
          return call_user_func_array('array_merge', 
              array_map(function($i) use ($args) { return array_column($args, $i); },
                        range(0, max(array_map('count', $args))-1)));
      }
      
      
      // Sample data:
      $x = array('1','2','3','4');
      $y = array('a','b','c','d','e');    
      $z = array('A','B','C');    
      
      $res = mix_merge($x, $y, $z);
      

      结果数组将是:

      ['1', 'a', 'A', '2', 'b', 'B', '3', 'c', 'C', '4', 'd', 'e']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-19
        • 2015-10-16
        • 2012-11-18
        • 2015-12-27
        相关资源
        最近更新 更多