PHP在空值上合并数组

11

我有两个数组需要合并,但是它们各自都有一些NULL

$a = array(
    'a' => NULL,
    'b' => 1,
    'c' => 1
);

$b = array(
    'a' => 1,
    'b' => NULL,
    'c' => 1    
);

所以,代码:

$c = array_merge($a,$b);

将会给出 $c:

array {
  'a'=> 1
  'b'=> NULL
  'c'=>1
}

是否有内置或简单的方法可以像以下这样设置边距($a,$b),但现在对于每个来自$b的相同索引,$a被覆盖。如果$b索引是null,我希望将$b由$a索引覆盖 - 如示例中的$b ['b']应从$a中覆盖。

所有空行(NULL)应尽可能填满。

5个回答

21
我认为您可以使用array_filter函数来删除数组中的空值,然后将它们合并。
$a = array(
    'a' => NULL,
    'b' => 1,
    'c' => 1
);

$b = array(
    'a' => 1,
    'b' => NULL,
    'c' => 1    
);

$b  = array_filter($b);
$a  = array_filter($a);
$c = array_merge($a, $b);
var_dump($c);

这将输出

array(3) {
  ["b"]=> int(1)
  ["c"]=> int(1)
  ["a"]=> int(1)
}

实时演示

顺便提一下,如果使用array_filter不带第二个参数,则会删除所有的NULL值以及EMPTY数组等。 如果只想删除NULL值,则需要使用array_filter($yourarray, 'strlen');

编辑

如果您想在两个数组具有相同的键且都为NULL时保留它,并假设两个数组具有相同数量的键/值,则需要循环遍历您的数组并构建一个新数组,在需要时保留NULL

$a = array(
    'a' => NULL,
    'b' => 1,
    'c' => 1,
    'd' => NULL
);

$b = array(
    'a' => 1,
    'b' => NULL,
    'c' => 1,   
    'd' => NULL,
);

$c = array();
foreach($a as $key => $val)
{
    if($key == NULL && $b[$key] == NULL)
    {
        $c[$key] = $val;
    } else if($key != NULL && $b[$key] == NULL) {
        $c[$key]= $val;
    } else if($key != NULL && $b[$key] != NULL) {
        $c[$key]= $b[$key];
    } else {
        $c[$key]= $b[$key];
    }
}
var_dump($c);

这将输出

array (size=4)
  'a' => int 1
  'b' => int 1
  'c' => int 1
  'd' => NULL

实时样例


如果只有一个数组中的'd'索引为空,会怎样呢?我的意思是,如果可能的话,请覆盖'nulls',否则它们应该保留。在这种情况下,所有的null都将被删除。 - Adam Pietrasiak
@Kluska000,我已经更新了我的答案以适应您的要求,请检查一下。 - Fabio
1
根据您的解决方案,我尝试了这个 - 看起来工作得更简单 http://phpfiddle.org/lite/code/rqz-sd4 - Adam Pietrasiak
@Kluska000 这很好,如果它能满足你的需求,我很高兴能帮助你。如果你觉得答案是正确的,那么不要忘记接受它,以帮助未来遇到类似问题的人们。 - Fabio

2

这些答案都没有解决合并可能具有不同键的两个数组的问题,这正是我来到这篇SO帖子的原因。幸运的是,它实际上非常简单:

function arrayMergeIfNotNull($arr1, $arr2) {
    foreach($arr2 as $key => $val) {
        $is_set_and_not_null = isset($arr1[$key]);
        if ( $val == NULL && $is_set_and_not_null ) {
            $arr2[$key] = $arr1[$key];
        }
    }
    return array_merge($arr1, $arr2);
}

现在,合并这两个数组:
$a = array('a' => NULL, 'b' => 1, 'c' => 1, 'd' => NULL, 'z' => 'zebra');
$b = array('a' => 1, 'b' => NULL, 'c' => 1, 'd' => NULL, 'f' => 'frank');

使用:

var_dump(arrayMergeIfNotNull($a, $b));

将会产生:

array (size=6)
  'a' => int 1
  'b' => int 1
  'c' => int 1
  'd' => NULL
  'z' => 'zebra'
  'f' => 'frank'

请注意,此答案还解决了具有相同键的两个数组的问题。

2
我会用一行简单的代码来完成它,就像这样:
$c = array_filter($b) + array_filter($a) + array_fill_keys(array_keys($b),null);

这将保留$b的所有键和值,除非它们是假值,在这种情况下,它们将被替换为来自$a的值,或者作为最后的选择被替换为null

使用+运算符合并数组时,从左到右出现的顺序等同于优先级。因此,最左边的位置将保持其值,除非该键不存在。

您也可以反转顺序并使用array_merge(),但对我来说这更难看:

$c = array_merge(array_fill_keys(array_keys($b),null) + array_filter($a) + array_filter($b));

0

然后您需要将 $b 作为第一个参数传递

$c = array_merge($b,$a);

您可以使用此函数

function mergeArray($array1, $array2)
{
    $result = array();

    foreach ($array1 as $key=>$value)
    {
        $result[$key] = $value;
    }

    foreach ($array2 as $key=>$value)
    {
        if (!isset($result[$key] || $result[$key] == null)
        {
            $result[$key] = $value;
        }
    }

    return $result;
}

在这种情况下,$a中的空行将覆盖$b中的非空行。应尽可能填充所有空行。 - Adam Pietrasiak
函数合并数组($array1, $array2) { $result = array();foreach ($array1 as $key=>$value) { $result[$key] = $value; } foreach ($array2 as $key=>$value) { if ($result[$key] == null) { } }} - MjeOsX

0
如果您需要保留在两个数组中具有NULL值的键,您可以使用一个自定义函数,该函数会忽略第二个数组中的这些条目(仅当第一个数组中存在相应的非NULL条目时)。它看起来像这样:

function arrayMergeIgnoringNull($arr1, $arr2) {
    $new2 = array();
    forEach ($arr2 as $key => $value) {
        if (($value !== NULL) || !isSet($arr1[$key])) {
           $new2[$key] = $value;
        } 
    }
    return array_merge($arr1, $new2);
}
$c = arrayMergeIgnoringNull($a, $b);

另外,也可以查看这个简短演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接