我有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行。
答案 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)
}
作为旁注,我想补充说,使用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);
答案 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));