Frage

Ich habe zwei Tierearrays (zum Beispiel).

$array = array(
    array(
        'id' => 1,
        'name' => 'Cat',
    ),
    array(
        'id' => 2,
        'name' => 'Mouse',
    )
);

$array2 = array(
    array(
        'id' => 2,
        'age' => 321,
    ),
    array(
        'id' => 1,
        'age' => 123,
    )
);

Wie kann ich die beiden Arrays nach der ID in einen verschmelzen?

War es hilfreich?

Lösung

Dies tut das, was Erik vorgeschlagen hat (ID -Nr. $array2 zu $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'];
    }
}

Andere Tipps

@Andy

http://se.php.net/array_merge

Das war mein erster Gedanke, aber es funktioniert nicht ganz - aber jedoch Array_merge_recursive Könnte funktionieren - zu faul, um jetzt zu überprüfen.

Warum verwenden Sie die ID nicht als Index (oder Schlüssel, im Mapping-Array, das PHP-Arrays IMO sind)?

$array = array(
    1 => array(
        'name' => 'Cat',
    ),
    2 => array(
        'name' => 'Mouse',
    )
);

Danach müssen Sie ein Array durchlaufen und Array_Merge auf den Elementen des anderen durchführen:

foreach($array2 as $key=>$value) {
  if(!is_array($array[$key])) $array[$key] = $value;
  else $array[$key] = array_merge($array[key], $value); 
}

Zumindest so etwas. Vielleicht gibt es eine bessere Lösung?

<?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 - Fusion zwei oder mehr Arrays rekursiv zusammenführen

Ausgänge:

        Array
(
    [a] => 1
    [b] => Array
        (
            [t] => 4
            [g] => Array
                (
                    [e] => 8
                    [h] => 5
                    [v] => 9
                )

            [0] => 4
        )

    [c] => 3
)

@Andy

Ich habe mir das bereits angesehen und nicht gesehen, wie es dazu beitragen kann, mehrdimensionale Arrays zu verschmelzen. Vielleicht könnten Sie ein Beispiel geben.

@Kevin

Das muss ich wahrscheinlich tun, wenn ich denke, dass der folgende Code sehr langsam sein wird. Der tatsächliche Code ist etwas anders, weil ich ADODB (und ODBC für die andere Abfrage) verwende, aber ich werde es funktionieren und meine eigene Antwort veröffentlichen.

Dies funktioniert, aber ich denke, es wird sehr langsam sein, da es jedes Mal durch die zweite Schleife geht:

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'];

Und das ist Ergebnis:

    [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);
?>

Mit PHP 5.3 können Sie diese Art von Zusammenführung mit Array_Replace_Recursive () machen

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

Ihr resultierendes Array sollte aussehen wie:

Array (
    [0] => Array
        (
            [id] => 2
            [name] => Cat
            [age] => 321
        )

    [1] => Array
        (
            [id] => 1
            [name] => Mouse
            [age] => 123
        )
)

Welches ist es, was Sie als Ergebnis wollen.

Ich würde es lieber bevorzugen array_splice Über array_merge Aufgrund seiner Leistungsprobleme wäre meine Lösung:

<?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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top