2016-04-23 1 views
1

Vous rencontrez des difficultés pour fusionner deux tableaux avec la même clé numérique. J'ai essayé array_merge() et array_merge_recursive(), mais tout ce qui semble faire est d'ajouter le deuxième tableau.Fusion de deux tableaux PHP avec la même clé numérique

Le premier tableau a la forme suivante:

Array 
(
    [384] => Array 
     (
      [name] => SomeMovieName1 
      [age] => 12.2 hrs 
      [IMDBLink] => 
      [IMDBRating] => 
      [coverArt] => 
     ) 

    [452] => Array 
     (
      [name] => SomeMovieName2 
      [age] => 13.1 hrs 
      [IMDBLink] => 
      [IMDBRating] => 
      [coverArt] => 
     ) 

    [945] => Array 
     (
      [name] => SomeMovieName3 
      [age] => 13.6 hrs 
      [IMDBLink] => 
      [IMDBRating] => 
      [coverArt] => 
     ) 
) 

Et voici le second tableau, je veux combiner/fusionner avec la première:

Array 
(
    [384] => Array 
     (
      [IMDBRating] => 7.2 
      [IMDBLink] => http://www.imdb.com/LinkToMovie1 
      [coverArt] => http://www.SomeLinkToCoverArt.com/1 
     ) 

    [452] => Array 
     (
      [IMDBRating] => 8.2 
      [IMDBLink] => http://www.imdb.com/LinkToMovie2 
      [coverArt] => http://www.SomeLinkToCoverArt.com/2 
     ) 

    [945] => Array 
     (
      [IMDBRating] => 6.2 
      [IMDBLink] => http://www.imdb.com/LinkToMovie3 
      [coverArt] => http://www.SomeLinkToCoverArt.com/3 
     ) 
) 

Et après la fusion, je voudrais la résultat à être:

Array 
(
    [0] => Array 
     (
      [name] => SomeMovieName1 
      [age] => 12.2 hrs 
      [IMDBRating] => 7.2 
      [IMDBLink] => http://www.imdb.com/LinkToMovie1 
      [coverArt] => http://www.SomeLinkToCoverArt.com/1 
     ) 

    [1] => Array 
     (
      [name] => SomeMovieName2 
      [age] => 13.1 hrs 
      [IMDBRating] => 8.2 
      [IMDBLink] => http://www.imdb.com/LinkToMovie2 
      [coverArt] => http://www.SomeLinkToCoverArt.com/2 
     ) 

    [2] => Array 
     (
      [name] => SomeMovieName3 
      [age] => 13.6 hrs 
      [IMDBRating] => 6.2 
      [IMDBLink] => http://www.imdb.com/LinkToMovie3 
      [coverArt] => http://www.SomeLinkToCoverArt.com/3 
     ) 
) 

Vous ne savez pas si c'est à cause des matrices internes causant un problème ne fonctionne pas directement avec array_merge() ou array_merge_recursive(). Toute aide serait appréciée,

Merci.

+0

pourquoi le tableau fusionné changer ses valeurs clés de $ de '[384] [452] [945]' à '[0] [1] [2]' ? – Webeng

+0

J'utilise un champ ID que j'attribue à chaque clé dans les deux tableaux de sorte que lorsque je les combinerais plus tard, je pourrais utiliser les touches pour savoir quel élément IMDB/etc combiné avec quoi plus tard. Je suis sûr que j'aurais pu le faire d'une manière différente, mais c'était la première idée dans mon esprit pour essayer. – Wallboy

Répondre

2

Vous pouvez essayer le code ci-dessous pour fusionner un tableau. Le code génère la sortie désirée requise pour vous. Je l'ai utilisé tableau d'échantillon donné par vous:

<?php 
    $arr1=array(
     "384"=>array("name"=>"SomeMovieName1","age"=>"12.2 hrs","IMDBLink"=>"","IMDBRating"=>"", "coverArt"=>""), 
     "452"=>array("name"=>"SomeMovieName2","age"=>"15.2 hrs","IMDBLink"=>"","IMDBRating"=>"", "coverArt"=>""), 
     "954"=>array("name"=>"SomeMovieName3","age"=>"4.2 hrs","IMDBLink"=>"","IMDBRating"=>"", "coverArt"=>"") 
    ); 
    $arr2=array(
     "384" => array("IMDBLink" => "7.2", "IMDBRating" => "http://www.imdb.com/LinkToMovie1", "coverArt" => "http://www.SomeLinkToCoverArt.com/1"), 
     "452" => array("IMDBLink" => "5","IMDBRating" => "http://www.imdb.com/LinkToMovie2", "coverArt" => "http://www.SomeLinkToCoverArt.com/2"), 
     "954"=>array("IMDBLink" => "8","IMDBRating" => "http://www.imdb.com/LinkToMovie3", "coverArt" => "http://www.SomeLinkToCoverArt.com/3") 
    ); 
    $arr3 = array(); 
    foreach($arr1 as $key=>$val) 
    { 
     $arr3[] = array_merge($val, $arr2[$key]); 
    } 
    echo "<pre>"; 
    print_r($arr3); 
?> 
+0

Merci, cela fonctionne parfaitement. Mon instinct m'a dit que j'allais probablement avoir besoin de faire une boucle dans l'un des tableaux avec un foreach et utiliser 'array_merge()' – Wallboy

0

Il peut être plus simple d'exécuter vos tableaux dans une boucle foreach et d'insérer simplement chaque valeur dans votre tableau initial. Appelons le premier réseau $myFirstArray et le deuxième réseau $mySecondArray:

foreach ($myFirstArray as $key => $value) 
{ 
    $myFirstArray[$key][IMDBRating] = $mySecondArray[$key][IMDBRating]; 
    $myFirstArray[$key][IMDBLink] = $mySecondArray[$key][IMDBLink]; 
    $myFirstArray[$key][coverArt] = $mySecondArray[$key][coverArt]; 
} 
0

n'a pas testé, mais il devrait fonctionner:

Appelez votre premier tableau AR1 $, et le deuxième Ar2 $

$result=array(); 
foreach($ar1 as $k=>$v) 
{ 
//if there is a corresponding array2 element 
if(isset($ar2[$k])){ 
     $result[] = array($v['name], $v['age'], $ar2[$k]['IMDBLink'], $ar2[$k]['IMDBRating'],$ar2['coverArt']); 
} 
} 

//result 
print_r($result); 
0

array_merge_recursive ne fonctionne pas car votre tableau externe a des clés numériques, pas des clés de chaîne. Lorsque array_merge ou array_merge_recursive reçoivent des tableaux numériques, ils les ajoutent plutôt que de fusionner des éléments avec les mêmes clés. Au lieu de cela, vous pouvez mapper les tableaux et fusionner les éléments correspondants à la place. Notez que ce code suppose que les deux tableaux d'entrée ont toutes les mêmes clés dans le même ordre. Si elles ne sont pas dans le même ordre, vous pouvez d'abord utiliser ksort pour les réorganiser.

Si elles peuvent avoir différentes clés, cependant, vous avez besoin d'une solution différente, comme la boucle dans la réponse de Webang.

+0

Il est possible que les deux tableaux aient un ordre de clés différent, mais je suppose que je pourrais juste les trier avant d'utiliser votre solution. Merci pour la contribution. – Wallboy