Слияние массивов против + [дубликат]
этот вопрос уже есть ответ здесь:
когда я использую array_merge() с ассоциативными массивами я получаю то, что хочу, но когда я использую их с числовыми массивами ключей, ключи меняются.
С + ключи сохраняются, но он не работает с ассоциативными массивами.
Я не понимаю, как это работает, Может кто-нибудь объяснить это мне?
2 ответов:
поскольку оба массива имеют числовую индексацию, будут использоваться только значения в первом массиве.
оператор + возвращает правый массив, присоединенный к левому массиву;для ключей, которые существуют в обоих массивах, будут использоваться элементы из левого массива, а соответствующие элементы из правого массива будут игнорируемый.
http://php.net/manual/en/language.operators.array.php
array_merge()имеет немного другое поведение:если входные массивы имеют одинаковые строковые ключи, то позже значение этого ключа будет перезаписывать предыдущий. однако, если массивы содержат числовые ключи, значение, упомянутое последним, не заменит исходное значение, а будет добавлено. Значения во входном массиве с цифровыми ключами будут перенумерованы с увеличением ключей, начиная с нуля в результирующем массиве.
эти две работы совершенно разные.
array plus
- операция Array plus обрабатывает весь массив как массив assoc.
- когда ключевой конфликт во время плюса, левое (Предыдущее) значение будет сохранено
null + array()вызовет фатальную ошибкуarray_merge ()
- array_merge () работает по-разному с index-array и ассок-массив.
- если оба параметра индекса массива, array_merge() индекс-массив конкатенацию значений.
- если нет, то индекс-массив будет преобразован в массив значений, а затем преобразован в массив assoc.
- теперь он получил два массива assoc и объединил их вместе, когда ключевой конфликт, правое(последнее) значение будет сохранено.
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; }
Comments