У меня есть два ассоциативных массива, которые имеют много контента, и поэтому я хочу объединить эти два массива таким образом, что если у меня есть массив в массиве 1 и в массиве 2, чем в массиве 3, у меня должны быть записи как для a's
и не для 1 ,
Я попытался использовать array_merge, но он будет перезаписывать записи в 1-м массиве, если в 2-м массиве есть дубликаты, я также пытался использовать +
но он дает мне фатальную ошибку, говорящую о Fatal error: Unsupported operand types in /home/code.php
затем I пытался сделать
(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
«Если объект преобразован в массив, результатом будет массив, элементами которого являются свойства объекта. Ключи – это имена переменных-членов с несколькими заметными исключениями: целочисленные свойства недоступны, а частные переменные имеют имя класса, добавленное к имя переменной, защищенные переменные имеют знак «*», добавленный к имени переменной. Эти предварительные значения имеют нулевые байты с обеих сторон ».
Теперь, имея два массива для добавления, 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; }
array_merge()
будет переопределять дубликаты только в том случае, если оба массива содержат одни и те же строковые ключи :
Если входные массивы имеют одинаковые строковые ключи, то более позднее значение для этого ключа перезапишет предыдущий. Если, однако, массивы содержат числовые клавиши, более поздняя величина не будет перезаписывать исходное значение, но будет добавлена.
Я считаю, что такое поведение ожидается. Как бы вы справились с этим делом? Предположим, что
$arr1 = array('a' => 1); $arr2 = array('a' => 2);
Что будет приемлемым выходом после слияния массива?