Ответ 1
$array1 + $array2
вернет объединение двух массивов. Если они ассоциативны, значения из левого операнда будут предпочтительнее, если клавиши будут сталкиваться. Поэтому это не то решение, которое вы хотите, поскольку значения будут потеряны.
В заявлении нет ничего плохого, поскольку обе переменные понимаются как массивы. Вероятно, ваша фатальная ошибка возникла из-за того, что одна переменная была фактически объектом, и это можно было бы ошибочно, используя var_dump. Добавляя типы бросков, вы заставили PHP принуждать обе переменные к массивам. Если бы одна переменная была объектом, она имела бы такой эффект:
"Если объект преобразован в массив, результатом является массив, элементы которого являются свойствами объекта. Ключи являются именами переменных-членов, с несколько примечательных исключений: целое число свойства недоступны; частный переменные имеют имя класса добавлено к имени переменной; защищенные переменные имеют значение '*' добавлено к имени переменной. Эти добавленные значения имеют нулевые байты в с обеих сторон".
Теперь, имея два массива, чтобы добавить, 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;
}