111 votes

Array_merge versus +

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

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

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

144voto

Christopher Armstrong Points 4931

Comme 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 d'entrée ont les mêmes clés de chaîne, alors la dernière valeur pour cette clé écrasera la précédente. Si, toutefois, les tableaux contiennent des clés numériques, la dernière valeur ne remplacera pas la valeur originale, mais sera ajoutée. Les valeurs du tableau d'entrée avec des clés numériques seront renumérotées avec des clés incrémentales à partir de zéro dans le tableau de résultat.

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

35voto

Gucci Koo Points 481

Ces deux opérations sont totalement différentes.

réseau plus

  1. L'opération "tableau plus" traite tous les tableaux comme des tableaux assoc.
  2. En cas de conflit de touches pendant le plus, la valeur gauche (précédente) est conservée.
  3. null + array() soulèvera une erreur fatale

array_merge()

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

Je poste le code ci-dessous pour rendre les choses plus claires.

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;
}

1voto

Pensez à lire Fusion de tableaux en PHP pour obtenir tous les détails sur les solutions de fusion de réseaux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X