Когда я использую array_merge()
с ассоциативными массивами, я получаю то, что хочу, но когда я использую их с числовыми ключевыми массивами, ключи меняются.
С +
ключи сохраняются, но не работают с ассоциативными массивами.
Я не понимаю, как это работает, может кто-нибудь объяснить это мне?
Поскольку оба массива численно проиндексированы, будут использоваться только значения в первом массиве.
Оператор + возвращает правый массив, присоединенный к левому массиву; для ключей, которые существуют в обоих массивах, будут использоваться элементы из левого массива, а соответствующие элементы из правого массива будут проигнорированы.
http://php.net/manual/en/language.operators.array.php
array_merge()
имеет несколько другое поведение:
Если входные массивы имеют одинаковые строковые ключи, то более позднее значение для этого ключа перезапишет предыдущий. Если, однако, массивы содержат числовые клавиши, более поздняя величина не будет перезаписывать исходное значение, но будет добавлена. Значения во входном массиве с числовыми клавишами будут перенумерованы с добавочными клавишами, начиная с нуля в массиве результатов.
Эти две операции совершенно разные.
массив плюс
- Операция Array plus обрабатывает весь массив в качестве массива-члена.
- Когда ключевой конфликт во время плюс, останется левое (предыдущее) значение
null + array()
приведет к фатальной ошибкеarray_merge ()
- array_merge () работает с индексом-массивом и ассоциативным массивом.
- Если оба параметра представляют собой индексный массив, массивы array_merge () concat index-array.
- Если нет, индекс-массив будет преобразовывать в массив значений, а затем преобразовывать в ассоциативный массив.
- Теперь он получил два массива и объединил их вместе, когда ключевой конфликт, право (последнее) значение будет сохранено.
array_merge(null, array())
возвращает array () и получил предупреждение, параметр # 1 не является массивом.
Я размещаю код ниже, чтобы все было ясно.
function array_plus($a, $b){ $results = array(); foreach($a as $k=>$v) if(!isset($results[$k]))$results[$k] = $v; foreach($b as $k=>$v) if(!isset($results[$k]))$results[$k] = $v; return $results; } //---------------------------------------------------------------- function is_index($a){ $keys = array_keys($a); foreach($keys as $key) { $i = intval($key); if("$key"!="$i") return false; } return true; } function array_merge($a, $b){ if(is_index($a)) $a = array_values($a); if(is_index($b)) $b = array_values($b); $results = array(); if(is_index($a) and is_index($b)){ foreach($a as $v) $results[] = $v; foreach($b as $v) $results[] = $v; } else{ foreach($a as $k=>$v) $results[$k] = $v; foreach($b as $k=>$v) $results[$k] = $v; } return $results; }