php array_merge 空数组,关于数组:php array_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] =>           //

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

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值