PHP合并空数上的数组

时间:2013-06-03 06:51:07

标签: php arrays merge

我有2 * array,我想merge他们,但每个主题都有一些NULL rows

$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),如下所示,但现在$a会覆盖$b的每个相同索引。如果$b索引为$b,我希望{$ 1}}被$ a index覆盖 - 示例null应该从$b['b']覆盖

如果可能,应填写所有NULL行。

5 个答案:

答案 0 :(得分:16)

我认为您可以使用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)
}

LIVE SAMPLE

作为旁注,我想补充说,使用array_filter而不使用第二个参数将最终删除所有NULL值以及EMPTY数组等。如果您只想删除{{ 1}}值,因此您需要使用NULL

<强> EDITED

如果你想保留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);

LIVE SAMPLE

答案 1 :(得分:1)

这些答案都没有解决合并两个可能有不同键的数组的问题,这就是我对这篇文章的回应。幸运的是,它实际上非常直接:

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 :(得分: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;
}

答案 3 :(得分: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);

另请参阅此 short demo

答案 4 :(得分:0)

我会用这样一个简单的衬里来做:

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