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

How to combine 2 associative arrays in php such that we do not overwrite any duplicate entries in all cases?

我有两个内容相同的关联数组,所以我想把这两个数组组合起来,这样如果我在数组1中有a,在数组2中有a,而在数组3中没有a's,我应该同时有a's和不是1的条目。

我试过使用数组合并,但如果第二个数组中有重复项,它会覆盖第一个数组中的项,我也试过使用+,但它给了我致命的错误,说Fatal error: Unsupported operand types in /home/code.php,然后我试过这样做。

(array)$ar3 = (array)$ar1 +(array)$ar2似乎加起来了。我想知道这是正确的方法,也是为什么最初我得到了致命的错误,并且它比我已经定义的$ar3、$ar2、$ar1作为数组类型所起的作用还要有效。

1
2
3
4
5
6
7
$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手册

"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没有什么好担心的。注意,当强制转换+的两个操作数时很重要,强制转换要分配给的变量毫无意义。表达式(array)$foo不修改$foo,而是返回一个新值。从需要声明变量的语言来看,这可能不是直观的,但PHP不是这样的语言。

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

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

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

将成为:

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

顺序还没有确定。结构唯一显著的变化是,所有的第一个值都是数组,允许重复键的值被累积。此函数执行任务,可能使用更好的名称:

1
2
3
4
5
6
7
8
9
10
11
12
// 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;
}


只有当两个数组包含相同的字符串键时,array_merge()才会重写重复项:

If the input arrays have the same
string keys, then the later value for
that key will overwrite the previous
one. If, however, the arrays contain
numeric keys, the later value will not
overwrite the original value, but will
be appended.

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

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

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