85 votes

Comment fusionner un tableau en préservant les clés ?

J'ai deux tableaux :

$array1 = array('a' => 1, 'b' => 2, 'c' => 3);
$array2 = array('d' => 4, 'e' => 5, 'f' => 6, 'a' => 'new value', '123' => 456);

Je veux les fusionner en conservant les clés et l'ordre et ne pas les réindexer !

Comment en arriver là ?

Array
(
    [a] => new value
    [b] => 2
    [c] => 3
    [d] => 4
    [e] => 5
    [f] => 6
    [123] => 456
)

J'essaie d'utiliser array_merge() mais les clés ne sont pas conservées :

print_r(array_merge($array1, $array2));

Array
(
    [a] => 'new value'
    [b] => 2
    [c] => 3
    [d] => 4
    [e] => 5
    [f] => 6
    [0] => 456
)

J'ai essayé d'utiliser l'opérateur d'union, mais il n'écrase pas cet élément :

print_r($array1 + $array2);

Array
(
    [a] => 1   <-- not overwriting
    [b] => 2
    [c] => 3
    [d] => 4
    [e] => 5
    [f] => 6
    [123] => 456
)

J'ai essayé d'échanger la place mais l'ordre n'est pas le bon, ce n'est pas ce dont j'ai besoin :

print_r($array2 + $array1);

Array
(
    [d] => 4
    [e] => 5
    [f] => 6
    [a] => new value 
    [123] => 456
    [b] => 2
    [c] => 3
)

Je ne veux pas utiliser de boucle, existe-t-il un moyen d'obtenir des performances élevées ?

190voto

Jack Points 88446

Vous recherchez array_replace() :

$array1 = array('a' => 1, 'b' => 2, 'c' => 3);
$array2 = array('d' => 4, 'e' => 5, 'f' => 6, 'a' => 'new value', '123' => 456);
print_r(array_replace($array1, $array2));

Disponible depuis PHP 5.3.

Mise à jour

Vous pouvez également utiliser l'union opérateur de tableau ; il fonctionne pour les anciennes versions et pourrait même être plus rapide :

print_r($array2 + $array1);

4voto

Orangepill Points 17802

@Jack a découvert la fonction native qui ferait cela, mais comme elle n'est disponible que dans php 5.3 et plus, cela devrait fonctionner pour émuler cette fonctionnalité sur les installations antérieures à la 5.3.

  if(!function_exists("array_replace")){
      function array_replace(){
         $args = func_get_args();
         $ret = array_shift($args);
         foreach($args as $arg){
             foreach($arg as $k=>$v){
                $ret[(string)$k] = $v;
             }
         }
         return $ret;
     }
 }

4voto

Mahesh Yadav Points 382

Supposons que nous ayons 3 tableaux comme ci-dessous.

$a = array(0=>['label'=>'Monday','is_open'=>1],1=>['label'=>'Tuesday','is_open'=>0]);

$b = array(0=>['open_time'=>'10:00'],1=>['open_time'=>'12:00']); 

$c = array(0=>['close_time'=>'18:00'],1=>['close_time'=>'22:00']); 

Maintenant, si vous voulez fusionner tous ces tableaux et obtenir un tableau final qui contient toutes les données du tableau sous la clé 0 dans 0 et 1 dans 1 clé et ainsi de suite.

Vous devez alors utiliser array_replace_recursive fonction PHP, comme ci-dessous.

$final_arr = array_replace_recursive($a, $b , $c); 

Le résultat sera le suivant.

Array
(
    [0] => Array
        (
            [label] => Monday
            [is_open] => 1
            [open_time] => 10:00
            [close_time] => 18:00
        )

    [1] => Array
        (
            [label] => Tuesday
            [is_open] => 0
            [open_time] => 12:00
            [close_time] => 22:00
        )

)

J'espère que la solution ci-dessus répondra au mieux à vos besoins !

2voto

Starx Points 38727

array_replace_recursive() o array_replace() est la fonction recherchée

$array1 = array('a' => 1, 'b' => 2, 'c' => 3);
$array2 = array('d' => 4, 'e' => 5, 'f' => 6, 'a' => 'new value', '123' => 456);

var_dump(array_replace_recursive($array1, $array2));

Démonstration

-2voto

dsuma Points 1000

Je pense que cela pourrait aider si je comprends bien :

foreach ($i = 0, $num = count($array2); $i < $num; $i++)
{
  $array = array_merge($array1, $arrar2[$i]);
}

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