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 ?

Était-ce utile?

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

http://se.php.net/array_merge

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
)

@Andy

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.

@kevin

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top