背景:Trevor正在使用标准算法的PHP实现:获取一组主要的默认名称 - 值对,并更新这些名称 - 值对,但仅限于那些实际存在有效更新值的名称 - 值对。
问题:默认情况下,PHP array_merge的工作方式如下......它将使用空值覆盖非空值。
$aamain = Array('firstname'=>'peter','age'=>'32','nation'=>'');
$update = Array('firstname' => '','lastname' => 'griffin', age =>'33','nation'=>'usa');
print_r(array_merge($aamain,$update));
/*
Array
(
[firstname] => //
[age] => 33 //
[lastname] => griffin //
[nation] => usa //
)
*/
问题:执行array_merge的代码行最少的方法是什么,其中空白值永远不会覆盖已存在的值?
print_r(array_coolmerge($aamain,$update));
/*
Array
(
[firstname] => peter //
[age] => 33
[lastname] => griffin
[nation] => usa
)
*/
更新:2016-06-17T11:51:54问题已更新,澄清了上下文并重命名了变量。
你想要重复的是什么?
处理重复项的标准行为很好:费拉条中的键值对将覆盖foobar中相应的键值对。 我想要的唯一区别是永远不要让费拉巴在foobar中删除一个值。
另请参见(基于python)stackoverflow.com/questions/38987/
另请参见(基于python)stackoverflow.com/q/6354436/42223
另见(php zeroes)stackoverflow.com/questions/14134006/
好吧,如果你想要一个"聪明"的方法来实现它,它就是这样,但它可能不像简单地做循环一样可读。
$merged = array_merge(array_filter($foo, 'strval'), array_filter($bar, 'strval'));
编辑:或使用+ ...
谢谢你。 避免循环可能在某种程度上被视为一种"无用的聪明" - 但是当在诸如map,select或listexrehension(在其他一些语言中实现)之类的东西时,不必总是使用循环是很好的。 看起来更简洁。
使用'trim'而不是'strval'也将清除仅包含空格的项目。
试试这个:
$merged = array_map(
create_function('$foo,$bar','return ($bar?$bar:$foo);'),
$foobar,$feebar
);
不是最易读的解决方案,但它应该只替换非空值,无论数组传递的顺序如何。
谢谢你。
根据您的需求调整:
# Replace keys in $fooforeach ($foo as $key => $value) {
if ($value != '' || !isset($bar[$key])) continue;
$foo[$key] = $bar[$key];
}
# Add other keys in $bar# Will not overwrite existing keys in $foo$foo += $bar;
谢谢你。
array_replace_recursive($array, $array2);
这是解决方案。
虽然此代码段可以解决问题,但包括解释确实有助于提高帖子的质量。 请记住,您将来会回答读者的问题,而这些人可能不知道您的代码建议的原因。
这是迄今为止最好的答案。 谢谢!
我同意,这是最好的解决方案。 无需解释。 PHP文档就足够了。
如果您还想保留两个数组中的空白值:
这会将重复数据放入一个新的数组中,我不知道这是不是你想要的。
$foobar = Array('firstname' => 'peter','age' => '33',);
$feebar = Array('firstname' => '','lastname' => 'griffin',);
$merged=$foobar;
foreach($feebar as $k=>$v){
if(isset($foobar[$k]))$merged[$k]=array($v,$foobar[$k]);
else $merged[$k]=$v;
}
print_r($merged);
?>
这将简单地确保费拉巴永远不会消除foobar中的值:
$foobar = Array('firstname' => 'peter','age' => '33',);
$feebar = Array('firstname' => '','lastname' => 'griffin',);
$merged=$foobar;
foreach($feebar as $k=>$v) if($v)$merged[$k]=$v;
print_r($merged);
?>
或者当然,
function cool_merge($array1,$array2){
$result=$array1;
foreach($array2 as $k=>$v) if($v)$result[$k]=$v;
return $result;
}
$foobar = Array('firstname' => 'peter','age' => '33',);
$feebar = Array('firstname' => '','lastname' => 'griffin',);
print_r(cool_merge($foobar,$feebar));
?>