以不同的顺序将两个数组合并到一起

时间:2018-05-04 09:49:40

标签: php arrays

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

采取以下数据示例:

$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)
);

请注意,数组已经' interlinked '并合并。我知道如果我只想将两者合并在一起,array_merge会起作用,但这会覆盖相同的数组。我想保留所有数据而没有一个数组覆盖另一个数据。

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

5 个答案:

答案 0 :(得分: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的问题,但除非原始数组密钥很重要,否则我无法查看或复制任何问题。

答案 1 :(得分:1)

您可以使用经典 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
        )

)

答案 2 :(得分:0)

试试这个

$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);

答案 3 :(得分:0)

根据评论和问题编辑,此函数交错两个数组,从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 :(得分:0)

$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