【问题标题】:Merge two arrays into each other with varying order以不同的顺序将两个数组相互合并
【发布时间】:2018-05-04 09:49:40
【问题描述】:

如何将两个数组合并在一起,但同时保留两个数组的数据,并将两个数组相互链接,以便数组中的帖子类型交替出现?

以数据为例:

$abc_posts = array(
    array('id' => 1),
    array('id' => 3)
);

$xyz_posts = array(
    array('id' => 2),
    array('id' => 4)
);

我怎样才能将它们合并在一起才能达到这个结果?

$merged_posts = array(
    array('id' => 1),
    array('id' => 2),
    array('id' => 3),
    array('id' => 4)
);

请注意,数组已“相互链接”并合并。我知道如果我只想将两者合并在一起,array_merge 会起作用,但这会覆盖相同的数组。我想保留所有数据,而不是让一个数组覆盖另一个数组。

还值得注意的是,上面显示的键值对只是一个示例,表明数组实际上已按交替顺序合并。我不需要按照 id 值本身的顺序合并它们(如果这有意义?)。

【问题讨论】:

  • 可能是 array_push() 然后 asort()..
  • 而且这两个数组的长度总是一样的?
  • @Eddie 是的,假设它们在两个数组中总是有 2 个索引要合并在一起。
  • 也许可以试试 $result = $array1 + $array2;
  • 您的测试数据应该真正显示array_merge 的问题(相同数据)并反映所需的输出。

标签: php arrays


【解决方案1】:
$abc_posts = array(
    array('id' => 1),
    array('id' => 3)
);

$xyz_posts = array(
    array('id' => 1),
    array('id' => 2),
    array('id' => 4)
);

$arr_merge = array_merge($abc_posts,$xyz_posts);
asort($arr_merge);
echo "<pre>"; print_r($arr_merge); echo "</pre>";

更多示例: http://php.net/manual/en/function.array-merge.php

【讨论】:

    【解决方案2】:

    array_mergeasort 的组合应该可以根据示例数据完成这项工作。

    $abc_posts = array(
        array('id' => 1),
        array('id' => 3)
    );
    
    $xyz_posts = array(
        array('id' => 1),
        array('id' => 2),
        array('id' => 4)
    );
    
    $merge = array_merge($abc_posts,$xyz_posts);
    asort($merge);  // only needed if you want to sort on `id`
    echo '<pre>';
    var_dump($merge);
    

    结果:

    array(5) {
      [0]=>  array(1) {
        ["id"]=>    int(1)
      }
      [2]=>  array(1) {
        ["id"]=>    int(1)
      }
      [3]=>  array(1) {
        ["id"]=>    int(2)
      }
      [1]=>  array(1) {
        ["id"]=>    int(3)
      }
      [4]=>  array(1) {
        ["id"]=>    int(4)
      }
    }
    

    注意:您谈到了 array_merge 的问题,但除非原始数组键很重要,否则我无法看到或复制任何问题。

    【讨论】:

      【解决方案3】:

      根据 cmets 和问题编辑,此函数交错两个数组,从 A 中获取一个元素,从 B 中获取一个元素,等等。但是示例数据确实具有误导性,这就是为什么其他答案假定按键排序的原因。

      function array_interleave($a, $b) {
        $ret = array();
        $posA = 0;
        $posB = 0;
        $i = 0;
        while ($posA < count($a) && $posB < count($b)) {
          $ret[] = ($i++ % 2 == 0 ? $a[$posA++] : $b[$posB++]);
        }
        while ($posA < count($a) || $posB < count($b)) {
          $ret[] = ($posA < count($a) ? $a[$posA++] : $b[$posB++]);
        }
        return $ret;
      }
      

      Try it online!

      【讨论】:

        【解决方案4】:

        您可以只使用 classic foreach 循环。

        $abc_posts = array(
            array('id' => 1),
            array('id' => 3)
        );
        
        $xyz_posts = array(
            array('id' => 2),
            array('id' => 4)
        );
        
        
        foreach( $abc_posts as $key => $val ) {
            $merged_posts[] = $val;                 //Push the current abc_posts element
            $merged_posts[] = $xyz_posts[$key];     //Push the xyz_posts with the same key/index
        }
        
        echo "<pre>";
        print_r( $merged_posts );
        echo "</pre>";
        

        这将导致:

        数组

        (
            [0] => Array
                (
                    [id] => 1
                )
        
            [1] => Array
                (
                    [id] => 2
                )
        
            [2] => Array
                (
                    [id] => 3
                )
        
            [3] => Array
                (
                    [id] => 4
                )
        
        )
        

        【讨论】:

          【解决方案5】:

          试试这个

          $c = array_merge($a,$b);
          asort($c);
          echo "<pre>";print_r($a);
          

          foreach($a as $aa){
              $b[] = $aa;
          }
          asort($b);
          echo "<pre>";print_r($b);
          

          【讨论】:

            【解决方案6】:

            因为提问者说这两个数组将被索引并且长度相等......

            您可以转置和展平。 (Demo)

            var_export(
                array_merge(
                    ...array_map(null, $abc_posts, $xyz_posts)
                )
            );
            

            但是您可以使用foreach() 进行更少的迭代。 (Demo)

            $result = [];
            foreach ($abc_posts as $index => $result[]) {
                $result[] = $xyz_posts[$index];
            }
            var_export($result);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2019-10-27
              • 2013-11-12
              • 1970-01-01
              • 2016-09-22
              • 1970-01-01
              • 2023-04-09
              • 2020-02-04
              相关资源
              最近更新 更多