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

use*_*204 11 php arrays

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

我已经尝试过使用array_merge但它会覆盖第一个数组中的条目,如果第二个数组中有任何重复,我也尝试过使用+但是它给了我致命的错误Fatal error: Unsupported operand types in /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;
Run Code Online (Sandbox Code Playgroud)

谢谢.

eri*_*sco 14

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

如果两个变量都被理解为数组,则该语句没有任何问题.您的致命错误可能是因为一个变量实际上是一个对象,并且可能使用var_dump将其误认为是错误的.通过添加类型转换,您强制PHP将两个变量强制转换为数组.如果一个变量是一个对象,它会产生这种效果:

来自PHP.net手册

"如果一个对象被转换为一个数组,那么结果就是一个数组,其元素是对象的属性.这些键是成员变量名,有一些值得注意的例外:整数属性是不可访问的;私有变量的类名前置于变量名;受保护变量在变量名前加上'*'.这些前置值在任一侧都有空字节."

现在要添加两个数组,PHP没有什么可惊慌的.请注意,虽然转换两个操作数+很重要,但是转换为您指定的变量是没有意义的.该表达式(array)$foo不会修改$ foo,而是返回一个新值.对于需要声明变量的语言,这可能不直观,但PHP不是这样的语言.

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

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

$a1 = array('a' => 1, 'b' => 2, 'c' => 3);
$a2 = array('a' => 3, 'b' => 2, 'd' => 2);
Run Code Online (Sandbox Code Playgroud)

会变成:

$a3 = array(
    'a' => array(1, 3),
    'b' => array(2, 2),
    'c' => array(3),
    'd' => array(2)
);
Run Code Online (Sandbox Code Playgroud)

订单未确定.对结构唯一值得注意的改变是所有第一个值都是数组,允许累积重复键的值.此功能执行任务,可能使用更好的名称:

// 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;
}
Run Code Online (Sandbox Code Playgroud)


Ana*_*nax 1

array_merge()仅当两个数组包含相同的字符串键时才会覆盖重复项:

如果输入数组具有相同的字符串键,则该键的后一个值将覆盖前一个值。但是,如果数组包含数字键,则后面的值不会覆盖原始值,而是会附加到后面。

我相信这种行为是预期的。会如何处理这个案子?这么说吧

$arr1 = array('a' => 1);
$arr2 = array('a' => 2);
Run Code Online (Sandbox Code Playgroud)

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