繁体   English   中英

php array_merge没有擦除值?

[英]php array_merge without erasing values?

背景: 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问题已更新,澄清了上下文并重命名了变量。

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

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

编辑:或使用+ ...

尝试这个:

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

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

根据您的需求调整:

# 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;
array_replace_recursive($array, $array2);

这是解决方案。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM