空值上的PHP合并数组
Posted
技术标签:
【中文标题】空值上的PHP合并数组【英文标题】:PHP merge array on nulls 【发布时间】:2013-05-29 06:55:33 【问题描述】:我有 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
索引是null
,我希望$b
被$a 索引覆盖 - 例如$b['b']
应该从$a
覆盖
如果可能,应填充所有 NULL 行。
【问题讨论】:
【参考方案1】:那么你必须将 $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;
【讨论】:
在这种情况下,$b 的非空行将被 $a 的空行覆盖。如果可能,应填充所有 NULL 行。 函数 mergeArray($array1, $array2) $result = array(); foreach ($array1 as $key=>$value) $result[$key] = $value; foreach ($array2 as $key=>$value) if ($result[$key] == null) 【参考方案2】:我认为您可以使用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
数组等。如果您只想删除 NULL
值,那么您将需要使用array_filter($yourarray, 'strlen');
已编辑
如果你想保留NULL
,如果两个数组都有相同的键并且假设两个数组有相同数量的键/值,那么你需要在你的数组中循环并构建一个新的数组来保留@987654334 @你需要的地方
$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
LIVE SAMPLE
【讨论】:
如果只有 1 个数组有 'd' 索引 null 怎么办。如果可能的话,我的意思是覆盖“空值”,如果不是,它们应该留下。在这种情况下,所有空值都将被删除。 @Kluska000 我已经根据您的要求更新了答案,请检查 根据您的解决方案,我已经尝试过这个 - 似乎正在工作并且更简单phpfiddle.org/lite/code/rqz-sd4 @Kluska000 如果它能满足您的需求,那就太好了,我很高兴能帮到您。如果您认为答案是正确的,请不要忘记接受它以帮助将来遇到类似问题的人。【参考方案3】:如果您需要在 both 数组中保留值为 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】:我会用这样一个简单的衬里来做到这一点:
$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));
【讨论】:
【参考方案5】:这些答案都没有解决合并可能具有不同键的两个数组,这就是我这篇 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'
注意这个答案也解决了两个数组具有相同键的问题。
【讨论】:
以上是关于空值上的PHP合并数组的主要内容,如果未能解决你的问题,请参考以下文章