合并2个数组,同时保留两个数组的值

时间:2019-10-09 12:43:46

标签: php arrays

我正在尝试使用array_merge合并到数组,但是我做的不对,或者此函数没有达到我的期望。

这里有2个数组

array_merge($array[0], $array[1]);

Array
(
    [0] => Array
        (
            [apples] => 1
            [pears] => 
            [oranges] => 
            [grapes] => 
            [melons] => 1

        )

    [1] => Array
        (
            [apples] => 
            [pears] => 1
            [oranges] => 1
            [grapes] => 
            [melons] => 
            [pineapples] => 
            [bananas] => 
            [lemons] => 
        )

)

我回来了,好像只是在使用第二个数组

 Array
        (
            [apples] => 
            [pears] => 1
            [oranges] => 1
            [grapes] => 
            [melons] => 
            [pineapples] => 
            [bananas] => 
            [lemons] => 
        )

但是我想要的结果是:

Array
(
    [0] => Array
        (
            [apples] => 1
            [pears] => 1
            [oranges] => 1
            [grapes] => 
            [melons] => 1
            [pineapples] => 
            [bananas] => 
            [lemons] => 

        )
)

任何帮助,将不胜感激。

3 个答案:

答案 0 :(得分:1)

从手册:

  

如果输入数组具有相同的字符串键,则该键的后一个值 将覆盖前一个

如果您希望其中一个包含值来覆盖其中任何一个的空值,请过滤出空值:

$result = array_merge(array_filter($array[0]), array_filter($array[1]));

但是,如果两个数组都具有相同的键并且都具有一个值,那么这仍将导致第二个值。另外,这不会在两个数组(例如pineapples)中保留键为空的键,因此您可能需要循环查看是否要包含的键,或者可能是:

$result = array_merge(array_merge(array_filter($array[0]), array_filter($array[1])),
                      array_filter($array[0]),
                      array_filter($array[1]));

答案 1 :(得分:1)

方法一。使用array_walk_recursive

array_walk_recursive($a, function($v, $k) use (&$r){
    isset($r[$k]) ? (!$v ? '' : ($r[$k] = $v)) : ($r[$k] = $v); 
});
print_r($r);

工作示例:https://3v4l.org/UpR2f

方法2。使用带有三元运算符的foreach进行迭代

$r = [];
foreach($a as $k => $v){
  foreach($v as $k1 => $v1){
    isset($r[$k1]) ? ($v1==1 ? ($r[$k1] = $v1) : '') : ($r[$k1] = $v1);
  }
}

工作示例:-https://3v4l.org/WXCpd

答案 2 :(得分:0)

如果要在两个数组中都保留空键,则可以自己循环和合并数组。

您可以使用第一个数组,该数组在foreach循环中从第二个数组添加键。

$pdo->exec('INSERT INTO Jobs VALUES (...)');
$jobId = $pdo->lastInsertId();

notify_new_job_to_worker($jobId); // how?

如果键冲突,它将保留第一个数组中的值。如果您想保留第二个数组中的值,则可以执行以下操作。

$result = $array[0];
foreach ($array[1] as $key => $value) {
    if (empty($result[$key])) {
        $result[$key] = $value;
    }
}