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

如何在php中组合2个关联数组,以便在所有情况下都不会覆盖任何重复条目?,php,arrays,Php,Arrays,我有两个关联数组,它们有许多相同的内容,所以我想以这样的方式组合这两个数组,如果数组1中有a,数组2中有a,而不是数组3中,我应该有a的条目,而不是1 我尝试过使用array\u merge,但如果第二个数组中有任何重复项,它会覆盖第1个数组中的条目,我也尝试过使用+,但它会给我致命错误,说致命错误:不支持/home/code.php中的操作数类型 (array)$ar3=(array)$ar1+(array)$ar2,它似乎是加起来的。我想知道这样做是否正确,以及为什么一开始我会出现致命错误,

我有两个关联数组,它们有许多相同的内容,所以我想以这样的方式组合这两个数组,如果数组1中有
a
,数组2中有
a
,而不是数组3中,我应该有
a
的条目,而不是1

我尝试过使用array\u merge,但如果第二个数组中有任何重复项,它会覆盖第1个数组中的条目,我也尝试过使用
+
,但它会给我致命错误,说
致命错误:不支持/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;
谢谢

array\u merge()
仅当两个数组都满足以下条件时才会覆盖重复项:

如果输入数组具有相同的 字符串键,然后是 该键将覆盖上一个键 一个。但是,如果数组包含 数字键,后面的值将不可用 覆盖原始值,但将 附在后面

我相信这种行为是意料之中的。你会怎么处理这个案子?这么说吧

$arr1 = array('a' => 1);
$arr2 = array('a' => 2);

数组合并后可以接受的输出是什么?

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

如果将两个变量都理解为数组,则该语句没有任何错误。发生致命错误的原因可能是一个变量实际上是一个对象,使用var_dump可能会出错。通过添加类型转换,您强制PHP将这两个变量强制到数组中。如果一个变量是一个对象,则会产生以下效果:

“如果将对象转换为数组, 结果是一个数组,其元素 是对象的属性。键 是成员变量名,带有 几个值得注意的例外:整数 财产是不可进入的;私有的 变量具有类名 在变量名前面加上前缀; 受保护的变量有一个“*” 变量名的前面。这些 带前缀的值在上有空字节 任何一方。”

现在有两个数组要添加,PHP没有什么好担心的。请注意,虽然强制转换
+
的两个操作数很重要,但强制转换分配给的变量是没有意义的。表达式
(数组)$foo
不修改$foo,而是返回一个新值。对于需要声明变量的语言来说,这可能不是直观的,但PHP不是这样一种语言

在另一个问题上,数组中不能有两个相同的键。这将导致无法索引数组,因为要返回的正确值将变得不明确。如果希望在无损庄园中组合两个阵列,则必须使用更复杂的数据结构

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

$a1 = array('a' => 1, 'b' => 2, 'c' => 3);
$a2 = array('a' => 3, 'b' => 2, '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;
}

看到这个相关的问题,你完全正确地使用了
+
,它将合并两个数组:“操作符+将右手数组中剩余键的元素附加到左手数组中,而重复的键不会被覆盖。”为什么你必须在我不知道之前将它们转换为数组?也许你有奇怪的代码;)请添加
变量转储的输出。当它们很长时缩短它们。这是非常奇怪的,它应该在没有强制转换的情况下工作。我确信json_decode返回一个数组,因为我在参数中给出true,所以它返回数组。事实上,现在代码中有些东西被弄乱了,所以正在努力修复它。发布更新可能需要一段时间。谢谢大家的帮助。你能解释一下这个函数到底在做什么吗?它是如何避免覆盖值的?这个函数的作用和我用$a1、a2和$a3描述的完全一样。组成数组的重复键中的值将累积到它们自己的数组中,而不是被覆盖。为了更好地理解它的行为,我建议您使用自己的测试数据尝试该函数。