php array_merge没有擦除值?

dre*_*mac 13 php arrays merge

背景: 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] =>           // <-- update set this to blank, NOT COOL!
    [age] => 33              // <-- update set this to 33, thats cool
    [lastname] => griffin    // <-- update added this key-value pair, thats cool
    [nation] => usa          // <-- update filled in a blank, thats cool.
)
*/
Run Code Online (Sandbox Code Playgroud)

问题:执行array_merge的代码行最少的方法是什么,其中空白值永远不会覆盖已存在的值?

print_r(array_coolmerge($aamain,$update));    
/*
Array
(
    [firstname] => peter  // <-- don't blank out a value if one already exists!
    [age] => 33
    [lastname] => griffin
    [nation] => usa

)
*/
Run Code Online (Sandbox Code Playgroud)

更新: 2016-06-17T11:51:54问题已更新,澄清了上下文并重命名了变量.

Mat*_*att 13

好吧,如果你想要一个"聪明"的方法来实现它,它就是这样,但它可能不像简单地做循环一样可读.

$merged = array_merge(array_filter($foo, 'strval'), array_filter($bar, 'strval'));
Run Code Online (Sandbox Code Playgroud)

编辑:或使用+ ...

  • 使用'trim'而不是'strval'也将清除仅包含空格的项目. (3认同)

Cal*_*vin 5

试试这个:

$merged = array_map(
    create_function('$foo,$bar','return ($bar?$bar:$foo);'),
    $foobar,$feebar
);
Run Code Online (Sandbox Code Playgroud)

不是最易读的解决方案,但它应该只替换非空值,无论数组传递的顺序如何.


小智 5

array_replace_recursive($array, $array2);
Run Code Online (Sandbox Code Playgroud)

这就是解决方案。

  • 虽然此代码片段可能会解决问题,但 [包括解释](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而那些人可能不知道您提出代码建议的原因。 (4认同)
  • 这是迄今为止最好的答案。谢谢! (3认同)
  • 我是否遗漏了一些东西,或者这根本不是OP所要求的?OP使用这个答案的结果将是: { ["firstname"] =&gt; "", ["age"] =&gt; "33", ["nation"] =&gt; "usa", ["lastname"] =&gt; "griffin ” } (2认同)