Как объединить 2 ассоциативных массива в php, чтобы мы не перезаписывали любые повторяющиеся записи во всех случаях?

У меня есть два ассоциативных массива, которые имеют много контента, и поэтому я хочу объединить эти два массива таким образом, что если у меня есть a в массиве 1 и a в массиве 2, чем в массиве 3, я должен иметь записи для a's, а не 1.

Я попытался использовать array_merge, но он перезаписывал записи в 1-м массиве, если в 2-м массиве есть дубликаты, я также попытался использовать +, но он дает мне фатальную ошибку, говоря 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;

Спасибо.

Ответ 1

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

Станет:

$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;
}

Ответ 2

array_merge() будет перекрывать дубликаты только в том случае, если оба массива содержат одни и те же строковые ключи:

Если входные массивы имеют одинаковые строковые ключи, то более позднее значение для этот ключ перезапишет предыдущий один. Если, однако, массивы содержат числовые ключи, более позднее значение не будет перезапишите исходное значение, но быть добавленным.

Я считаю, что такое поведение ожидается. Как бы вы справились с этим делом? Скажем, что

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

Что будет приемлемым выходом после слияния массива?