Array_merge против +

Когда я использую array_merge() с ассоциативными массивами, я получаю то, что хочу, но когда я использую их с числовыми ключевыми массивами, ключи меняются.

С + ключи сохраняются, но они не работают с ассоциативными массивами.

Я не понимаю, как это работает, может кто-нибудь объяснить это мне?

Ответ 1

Поскольку оба массива численно проиндексированы, будут использоваться только значения в первом массиве.

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

http://php.net/manual/en/language.operators.array.php

array_merge() имеет несколько другое поведение:

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

http://php.net/manual/en/function.array-merge.php

Ответ 2

Эти две операции совершенно разные.

массив плюс

  •   
  • Операция Array plus обрабатывает весь массив в качестве массива-члена.  
  • Когда ключевой конфликт во время плюс, останется левое (предыдущее) значение.  
  • null + array() приведет к фатальной ошибке  

array_merge()

  •   
  • array_merge() работает с индексом-массивом и ассоциативным массивом.  
  • Если оба параметра представляют собой индексный массив, значения массива array_merge() concat index-array.  
  • Если нет, индексный массив будет преобразовывать в массив значений, а затем преобразовывать в ассоциативный массив.  
  • Теперь он получил два массива-адреса и объединил их вместе, когда ключевой конфликт, правое (последнее) значение будет сохранено.  
  • array_merge(null, 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;
}