10

I have 2 * array and I want to merge them, but each of theme have some NULL rows.

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

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

So, code:

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

Will give $c:

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

Is there build in or simple way to do margin ($a,$b) like following, but now $a is overwritten for every same index from $b. I want $b to be overwritten by $a index if $b index is null - in example $b['b'] should be overwritten from $a

All NULL rows should be filled if possible.

4

5 回答 5

20

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

现场样品

于 2013-06-03T06:59:45.317 回答
1

这些答案都没有解决合并两个可能具有不同键的数组,这就是导致我这篇 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'

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

于 2015-10-30T17:40:14.433 回答
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;
}
于 2013-06-03T06:56:09.867 回答
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);

另请参阅这个简短的演示

于 2013-06-03T07:11:31.557 回答
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));
于 2015-10-23T19:52:06.020 回答