Слияние массивов против + [дубликат]



этот вопрос уже есть ответ здесь:



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



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



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

487   2  

2 ответов:

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

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

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

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

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

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

эти две работы совершенно разные.

array plus

  1. операция Array plus обрабатывает весь массив как массив assoc.
  2. когда ключевой конфликт во время плюса, левое (Предыдущее) значение будет сохранено
  3. null + array() вызовет фатальную ошибку

array_merge ()

  1. array_merge () работает по-разному с index-array и ассок-массив.
  2. если оба параметра индекса массива, array_merge() индекс-массив конкатенацию значений.
  3. если нет, то индекс-массив будет преобразован в массив значений, а затем преобразован в массив assoc.
  4. теперь он получил два массива assoc и объединил их вместе, когда ключевой конфликт, правое(последнее) значение будет сохранено.
  5. 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

    Ничего не найдено.