2011-10-11 4 views
4

J'ai deux tableaux multidimensionnels comme:Combiner deux tableaux multidimensionnels

[a] 
    [b] 
    [c]    

et

[a] 
    [b] 
    [c] 
    [d] 

et que vous voulez transformer en un seul tableau

[a] 
    [b] 
    [c] 
    [d] 

J'ai essayé la fonction array_merge_recursive() , mais il crée de nouveaux éléments au dernier niveau au lieu de les écraser.

Par exemple, si [c] est "X" dans le premier tableau, et "Y" dans le second tableau, je reçois array("X", "Y") au lieu de la dernière valeur ("Y").

+0

Cela semble être le comportement par défaut. Vous devrez peut-être écrire les vôtres en utilisant 'array_walk_recursive()' ou un autre UDF pour exécuter la logique que vous décrivez. –

+0

J'ai un doute, qu'en est-il si 2ème tableau détient ** [p] [q] [c] [d] ** ce type de données? Quelle est l'attente de production? –

+0

S'il vous plaît nous montrer votre code et l'entrée et la sortie réelle. –

Répondre

9

Est-ce que vous êtes après, en utilisant array_replace_recursive?

<?php 

$arr1 = array ('a' => array ('b' => array ('c' => 'X'), 'd' => 'array_1_d')); 
$arr2 = array ('a' => array ('b' => array ('c' => 'Y', 'd' => 'Z')), 'e' => 'array_2_e'); 

$arr3 = array_replace_recursive ($arr1, $arr2); 

var_dump($arr3); 

Sorties:

array(2) { 
    ["a"]=> 
    array(2) { 
    ["b"]=> 
    array(2) { 
     ["c"]=> 
     string(1) "Y" 
     ["d"]=> 
     string(1) "Z" 
    } 
    ["d"]=> 
    string(9) "array_1_d" 
    } 
    ["e"]=> 
    string(9) "array_2_e" 
} 

http://www.php.net/manual/en/function.array-replace-recursive.php

+2

+1, ne savait pas à propos de cette fonction. – hakre

+0

Je pense qu'il s'agit d'une fonction nouvelle introduite à peu près en même temps que les objets Iterator ... Je l'avais également négligé :) – CD001

+0

@ CD001; C'est depuis PHP 5.3, les itérateurs existaient longtemps avant cela. – hakre

1

Modifier:Just seeing, une fonction existe pour cela :): array_replace_recursiveDocs. Dans le cas ci-dessous PHP 5.3, cela pourrait encore être utile:

Union of two arrays (avec les touches de chaîne), récursif:

function array_union_recursive(Array $a, Array $b) 
{ 
    foreach($a as $k => &$v) 
    { 
     if (is_array($v) && isset($b[$k]) && is_array($b[$k])) 
     { 
      $v = array_union_recursive($a[$k], $b[$k]); 
     } 
    } 

    $a += $b; 
    return $a; 
} 

Si vous voulez obtenir la dernière valeur au lieu de la première, vous avez besoin d'échanger $a et $b lors de l'appel de la fonction mais dans tous les cas vous devez spécifier les règles d'une manière ou d'une autre. C'est pourquoi array_merge_recursive enregistre chaque valeur.

Demo

+0

merci cela fonctionne! mais je vais aller avec array_replace_recursive de Daren car il est construit en: D – Alex

+0

@Alex, bien sûr, je ne le savais pas sinon je l'aurais suggéré;) – hakre

1

considérant deux tableaux:

<?php 
$test1 = array(array('a','b','c'), 'a', 'b'); 
$test2 = array(array('d','e'), 'c'); 
?> 

tout en utilisant la fusion Ecraser que vous attendez que le résultat soit un tableau:

<?php $test3 = array(array('d','e'), 'c', 'b'); ?> 

Cependant, la plupart des fonctions entraînera ce tableau:

Alors, voici une fonction pour le faire:

<?php 
function array_merge_overwrite(array &$array1, array $array2 = NULL) 
{ 
    $flag = true; 
    foreach (array_keys($array2) as $key) 
    { 
     if (isset($array2[$key]) && is_array($array2[$key])) 
     { 
      if (isset($array1[$key]) && is_array($array1[$key])) 
       array_merge_overwrite($array1[$key], $array2[$key]); 
      else 
       $array1[$key] = $array2[$key]; 

      $flag = false; 
     } 
    } 

    if ($flag == true) 
     $array1 = $array2; 
} 
?> 
+0

Si vous passez un tableau vide comme '$ array2', la fonction retournera un tableau vide? – hakre