2010-09-22 5 views
0

Exemple:Comment fusionner 2 tableaux associatifs en PHP?

$arr1 = array('a' => "1", 'b' => "2", 'c' => "3", 'z' => "4"); 
$arr2 = array('a' => "9", 'b' => "8", 'c' => "7", 'd' => "6", 'e' => "5"); 

Sortie:

$result = array('a' => array('f1' => "1", 'f2' => "9"), 
       'b' => array('f1' => "2", 'f2' => "8"), 
       'c' => array('f1' => "3", 'f2' => "7"), 
       'd' => array('f1' => "0", 'f2' => "6"), 
       'e' => array('f1' => "0", 'f2' => "5"), 
       'z' => array('f1' => "4", 'f2' => "0"),); 

la taille de arr1 $ peut être '>', '<' ou '=' taille de $ arr2

+0

sont des valeurs non-existantes remplies de ' "0"' ? – Gumbo

+0

Sûr regarde de cette façon. Il aura besoin d'une double passe. – webbiedave

+0

Qu'avez-vous jusqu'à présent D3VELOPER? – webbiedave

Répondre

3

Je pense que ce qu'il,

$arr1 = array('a' => "1", 'b' => "2", 'c' => "3", 'z' => "4"); 

$arr2 = array('a' => "9", 'b' => "8", 'c' => "7", 'd' => "6", 'e' => "5"); 


foreach($arr1 as $key => $value){ 
    $a[$key]['f1'] = $value; 
} 

foreach($arr2 as $key => $value){ 
    $b[$key]['f2'] = $value; 
} 

$c = array_merge_recursive($a, $b); 
foreach($c as $key => $value){ 
    $result[$key]['f1'] = (array_key_exists('f1', $value)) ? $value['f1']: 0; 
    $result[$key]['f2'] = (array_key_exists('f2', $value)) ? $value['f2']: 0; 
} 

echo "<pre>".print_r ($result, true); 

la sortie:

Array 
(
    [a] => Array 
     (
      [f1] => 1 
      [f2] => 9 
     ) 

    [b] => Array 
     (
      [f1] => 2 
      [f2] => 8 
     ) 

    [c] => Array 
     (
      [f1] => 3 
      [f2] => 7 
     ) 

    [z] => Array 
     (
      [f1] => 4 
      [f2] => 0 
     ) 

    [d] => Array 
     (
      [f1] => 0 
      [f2] => 6 
     ) 

    [e] => Array 
     (
      [f1] => 0 
      [f2] => 5 
     ) 

) 
1

array_merge_recursive() devrait travail: http://php.net/manual/en/function.array-merge-recursive.php

sinon c'est assez simple wo mettre en œuvre en quelques lignes: (sauf si re allié besoin d'indices "fn")

function my_merge(){ 

    $result = array(); 
    foreach(func_get_args() as $a) 
     foreach($a as $index => $value) 
      $result[$index][] = $value;   

} 
+0

Détendez vos exigences pour le format de données et vous pouvez simplifier le code de plusieurs ordres de grandeur. À moins que cela * vraiment, vraiment * doit avoir exactement le format dans votre exemple, c'est un compromis raisonnable. – geon

0

Essayez ceci:.

$keys = array_unique(array_merge(array_keys($arr1), array_keys($arr2))); 
$values = array_map(function($key) use ($arr1, $arr2) { 
    return array('f1' => isset($arr1[$key]) ? $arr1[$key] : "0", 
       'f2' => isset($arr2[$key]) ? $arr2[$key] : "0"); } 
    , $keys); 
$result = array_combine($keys, $values); 
var_dump($result); 

Quelques explications:

  • Au début, obtenir un tableau $keys de toutes les clés uniques des deux tableaux.
  • Ensuite, pour chaque clé, le tableau de valeurs correspondant est ensuite généré.
  • Enfin, le tableau de clés et le tableau de valeurs sont combinés.

Mais cela ne fonctionne actuellement qu'avec deux groupes.


Modifier est ici celui qui fonctionne avec un nombre arbitraire de tableaux:

$arrays = array($arr1, $arr2); 
$keys = array_unique(call_user_func_array('array_merge', array_map('array_keys', $arrays))); 
$values = array_map(function($key) use ($arrays) { 
    return array_combine(array_map(function($key) { 
     return 'f'.($key+1); 
    }, array_keys($arrays)), 
    array_map(function($array) use ($key) { 
     return isset($array[$key]) ? $array[$key] : "0"; 
    }, $arrays)); 
}, $keys); 
$result = array_combine($keys, $values); 
var_dump($result); 

Quelques explications:

  • Mettez tous les tableaux dans un tableau $arrays.
  • Pour chaque tableau dans $arrays, appelez le array_keys pour obtenir les clés, fusionner ces tableaux et obtenir un tableau $keys de toutes les clés uniques. Pour chaque clé de $keys, vérifiez si la clé existe dans la matrice de tableaux $arrays.
  • Combinez les clés et les valeurs.
+0

@ D3VELOPER: Pouvez-vous élaborer là-dessus? Ça fonctionne bien pour moi. – Gumbo

0
$arr1 = array('a' => "1", 'b' => "2", 'c' => "3", 'z' => "4"); 

$arr2 = array('a' => "9", 'b' => "8", 'c' => "7", 'd' => "6", 'e' => "5"); 

function combineArray($arr1, $arr2) { 
    if (is_array($arr1) && is_array($arr2)) { 
     $rArr = array(); 
     $steps = max (count($arr1),count($arr2)); 
    $ak1 = array_keys($arr1); 
    $ak2 = array_keys($arr2); 

     for ($i=0;$i<$steps;$i++) { 
       if (!isset($rArr[$i])) $rArr[$i]=array(); 
       $rArr[$i]['f1'] = (isset($arr1[$ak1[$i]])) ? $arr1[$ak1[$i]]: '0'; 
       $rArr[$i]['f2'] = (isset($arr2[$ak2[$i]])) ? $arr2[$ak2[$i]]: '0'; 
     } 
     return $rArr; 

    }else { 
     return false; 
    } 
} 

echo "<pre>".print_r (combineArray($arr1, $arr2),true); 

pourrait fonctionner :)

+0

AH ... oublie ça -.-: D – someGuy

Questions connexes