web-dev-qa-db-fra.com

Array_merge contre +

Lorsque j'utilise array_merge() avec des tableaux associatifs, j'obtiens ce que je veux, mais lorsque je les utilise avec des tableaux de touches numériques, les clés sont modifiées.

Avec + les clés sont conservées mais cela ne fonctionne pas avec les tableaux associatifs.

Je ne comprends pas comment cela fonctionne, quelqu'un peut-il me l'expliquer?

108
Elly

Étant donné que les deux tableaux sont indexés numériquement, seules les valeurs du premier tableau seront utilisées.

L'opérateur + renvoie le tableau de droite ajouté au tableau de gauche; pour les clés qui existent dans les deux tableaux, les éléments du tableau de gauche seront utilisés et les éléments correspondants du tableau de droite seront ignorés.

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

array_merge() a un comportement légèrement différent:

Si les tableaux en entrée ont les mêmes clés de chaîne, la dernière valeur de cette clé remplacera la précédente. Si, toutefois, les tableaux contiennent des clés numériques, la valeur ultérieure ne remplacera pas la valeur d'origine, mais sera ajoutée. Les valeurs dans le tableau d'entrée avec les touches numériques seront renumérotées avec des clés d'incrémentation à partir de zéro dans le tableau de résultats.

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

140

Ces deux opérations sont totalement différentes.

tableau plus

  1. L'opération Array plus traite tous les tableaux comme des tableaux associés.
  2. En cas de conflit de touches pendant plus, la valeur gauche (précédente) sera conservée
  3. null + array() provoquera une erreur fatale

array_merge ()

  1. array_merge () fonctionne différemment avec index-array et assoc-array.
  2. Si les deux paramètres sont index-array, array_merge () concat index-array values.
  3. Sinon, le tableau d'index sera converti en tableau de valeurs, puis converti en tableau assoc.
  4. Maintenant, il a obtenu deux tableaux d'associations et les fusionne ensemble, en cas de conflit de clé, la bonne (dernière) valeur sera conservée.
  5. array_merge(null, array()) renvoie array () et a reçu un avertissement, le paramètre # 1 n'est pas un tableau.

Je poste le code ci-dessous pour clarifier les choses.

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;
}
27
Gucci Koo