微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在PHP中组合2个关联数组,以便我们在所有情况下不覆盖任何重复条目?

我有两个关联数组,它们有很多内容相同,所以我想以这样一种方式组合这两个数组,如果我在数组1中有一个数组,而数组2中的数组不是数组3,那么我应该有两个数组.

我已经尝试使用array_merge但它会覆盖第一个数组中的条目,如果在第二个数组中有任何重复,我也尝试使用,但它给我致命的错误说致命错误不支持的操作数类型在/home/code.PHP然后我试过干

(array)$ar3 =(array)$ar1(array)$ar2,似乎加起来.我想知道这是正确的方法,也是为什么最初我有致命的错误,而不是像我已经定义$ar3,$ar2,$ar1作为数组类型的工作.

$orders = new Order(); 
$prospectOffers = $orders->getorder($orderConfNumber); 
$prospectOffersResult = json_decode($prospectOffers,true); 
$shoppingBasket = $cart->getCartItems(); 
var_dump($prospectOffersResult); // Both are arrays 
var_dump($shoppingBasket); //Both are arrays 
(array)$result = (array)$prospectOffersResult+(array)$shoppingBasket;

谢谢.

$array1 $array2将返回两个数组的并集.如果它们是关联的,则如果键碰撞,则左操作数的值将是首选的.因此,这不是您想要的解决方案,因为值将丢失.

语句没有错,只要这两个变量都被理解为数组.您的致命错误可能发生,因为一个变量实际上是一个对象,并且可能会使用var_dump错误.通过添加类型转换,您强制PHP强制将两个变量强制转换为数组.如果一个变量是一个对象,它会有这样的效果

PHP.net Manual

“If an object is converted to an array,
the result is an array whose elements
are the object’s properties. The keys
are the member variable names,with a
few notable exceptions: integer
properties are unaccessible; private
variables have the class name
prepended to the variable name;
protected variables have a ‘*’
prepended to the variable name. These
prepended values have null bytes on
either side.”

现在有两个数组可以添加,PHP没有什么可怕的.请注意,尽管投射两个操作数很重要,但是将您所分配的变量转换为无意义.表达式(数组)$foo不会修改$foo,而是返回一个新值.对于需要声明变量的语言,这可能不是直观的,但是PHP不是这样的语言.

在其他问题上,数组中不能有两个相同的键.这将使得无法对数组进行索引,因为返回的正确值将变得模糊.如果您希望在无损管理器中组合两个数组,则必须使用更复杂的数据结构.

我的建议是使用一个数组,其中:

$a1 = array('a' => 1,'b' => 2,'c' => 3);
$a2 = array('a' => 3,'d' => 2);

会变成:

$a3 = array(
    'a' => array(1,3),'b' => array(2,2),'c' => array(3),'d' => array(2)
);

而且订单没有确定.结构唯一显着的变化是所有的第一个值都是数组,允许重复键的值被累积.此功能可以完成任务,并且可以使用更好的名称

// array(array) lossless_array_merge([$array1 [,$array2 [,$...]]])

function lossless_array_merge() {
  $arrays = func_get_args();
  $data = array();
  foreach ($arrays as $a) {
    foreach ($a as $k => $v) {
      $data[$k][] = $v;
    }
  }
  return $data;
}

原文地址:https://www.jb51.cc/php/131460.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐