Comment puis-je fusionner des tableaux PHP ?
Question
J'ai deux tableaux d'animaux (par exemple).
$array = array(
array(
'id' => 1,
'name' => 'Cat',
),
array(
'id' => 2,
'name' => 'Mouse',
)
);
$array2 = array(
array(
'id' => 2,
'age' => 321,
),
array(
'id' => 1,
'age' => 123,
)
);
Comment puis-je fusionner les deux tableaux en un seul par l'ID ?
La solution
Cela fait ce qu'Erik a suggéré (numéro d'identification.comme clé de tableau) et fusionne les valeurs dans $array2
à $results
.
$results = array();
foreach($array as $subarray)
{
$results[$subarray['id']] = array('name' => $subarray['name']);
}
foreach($array2 as $subarray)
{
if(array_key_exists($subarray['id'], $results))
{
// Loop through $subarray would go here if you have extra
$results[$subarray['id']]['age'] = $subarray['age'];
}
}
Autres conseils
@Andy
C'était ma première pensée mais ça ne marche pas vraiment - cependant array_merge_recursive pourrait fonctionner - trop paresseux pour vérifier maintenant.
Tout d'abord, pourquoi n'utilisez-vous pas l'ID comme index (ou clé, dans le tableau de style mappage que les tableaux php sont imo) ?
$array = array(
1 => array(
'name' => 'Cat',
),
2 => array(
'name' => 'Mouse',
)
);
après cela, vous devrez effectuer une recherche dans un tableau, en effectuant array_merge sur les éléments de l'autre :
foreach($array2 as $key=>$value) {
if(!is_array($array[$key])) $array[$key] = $value;
else $array[$key] = array_merge($array[key], $value);
}
Quelque chose comme ça au moins.Peut-être existe-t-il une meilleure solution ?
<?php
$a = array('a' => '1', 'b' => array('t' => '4', 'g' => array('e' => '8')));
$b = array('c' => '3', 'b' => array('0' => '4', 'g' => array('h' => '5', 'v' => '9')));
$c = array_merge_recursive($a, $b);
print_r($c);
?>
array_merge_recursive — Fusionner deux ou plusieurs tableaux de manière récursive
les sorties:
Array
(
[a] => 1
[b] => Array
(
[t] => 4
[g] => Array
(
[e] => 8
[h] => 5
[v] => 9
)
[0] => 4
)
[c] => 3
)
J'ai déjà regardé cela et je n'ai pas vu comment cela pouvait aider à fusionner des tableaux multidimensionnels.Peut-être pourriez-vous donner un exemple.
C'est probablement ce que je devrai faire car je pense que le code ci-dessous sera très lent.Le code réel est un peu différent car j'utilise ADOdb (et ODBC pour l'autre requête) mais je vais le faire fonctionner et publier ma propre réponse.
Cela fonctionne, mais je pense que ce sera très lent car il passe par la deuxième boucle à chaque fois :
foreach($array as &$animal)
{
foreach($array2 as $animal2)
{
if($animal['id'] === $animal2['id'])
{
$animal = array_merge($animal, $animal2);
break;
}
}
}
foreach ($array as $a)
$new_array[$a['id']]['name'] = $a['name'];
foreach ($array2 as $a)
$new_array[$a['id']]['age'] = $a['age'];
et voici le résultat :
[1] => Array
(
[name] => Cat
[age] => 123
)
[2] => Array
(
[name] => Mouse
[age] => 321
)
<?php
$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);
print_r($result);
?>
Avec PHP 5.3, vous pouvez effectuer ce type de fusion avec array_replace_recursive()
http://www.php.net/manual/en/function.array-replace-recursive.php
Le tableau résultant devrait ressembler à :
Array (
[0] => Array
(
[id] => 2
[name] => Cat
[age] => 321
)
[1] => Array
(
[id] => 1
[name] => Mouse
[age] => 123
)
)
C’est ce que je pense que vous vouliez en conséquence.
je préférerais array_splice
sur array_merge
en raison de ses problèmes de performances, ma solution serait la suivante :
<?php
array_splice($array1,count($array1),0,$array2);
?>
$new = array();
foreach ($array as $arr) {
$match = false;
foreach ($array2 as $arr2) {
if ($arr['id'] == $arr2['id']) {
$match = true;
$new[] = array_merge($arr, $arr2);
break;
}
}
if ( !$match ) $new[] = $arr;
}