php array_merge没有擦除值?

时间:2009-04-27 13:22:28

标签: 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.
)
*/

问题:尽管空白值永远不会覆盖已存在的值,但是使用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

)
*/

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

6 个答案:

答案 0 :(得分:13)

好吧,如果你想要一个“聪明”的方法来实现它,就在这里,但它可能不像简单的循环一样可读。

$merged = array_merge(array_filter($foo, 'strval'), array_filter($bar, 'strval'));

编辑:或使用+ ...

答案 1 :(得分:5)

试试这个:

$merged = array_map(
    create_function('$foo,$bar','return ($bar?$bar:$foo);'),
    $foobar,$feebar
);

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

答案 2 :(得分:4)

根据您的需求进行调整:

# Replace keys in $foo
foreach ($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;

答案 3 :(得分:3)

array_replace_recursive($array, $array2);

这是解决方案。

答案 4 :(得分:1)

这会将重复数据放入一个新的数组中,我不知道这是不是你想要的。

<?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中的值:

<?php
  $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));
?>

答案 5 :(得分:1)

如果您还想保留两个数组中的空白值:

array_filter($foo) + array_filter($bar) + $foo + $bar