2016-11-11 3 views
2

Ich versuche, zwei Arrays zu vergleichen, und extrahieren einige Informationen von einem von ihnen und speichern Sie es in einem anderen Array (3.). Die Struktur dieser beiden Arrays sieht wie folgt aus:Arrays Vergleich in PHP

Array(
[0] => stdClass Object 
    (
     [Id] => 123 
     [Size] => small 
     [Color] => yellow 
    ) 
[1] => stdClass Object 
    (
     [Id] => 456 
     [Size] => large 
     [Color] => red 
    ) 
[2] => stdClass Object 
    (
     [Id] => 789 
     [Size] => medium 
     [Color] => blue 
    ) 
) 
Array 
(
[0] => stdClass Object 
    (
     [Id] => 456 
     [Size] => large 
     [Color] => red 
     [Available] => true 
    ) 

[1] => stdClass Object 
    (
     [Id] => 123 
     [Size] => small 
     [Available] => false 
    ) 
[2] => stdClass Object 
    (
     [Id] => 789 
     [Size] => medium 
     [Color] => blue 
     [Available] => true 
    ) 
) 

Im Beispiel, ich brauche nur die Eigenschaft „verfügbar“ zu speichern, wenn die ID dieser Arrays gleich sind.

Was habe ich versucht zu tun:

for (var $i = 0; $i < count($arrayA); $i++) { 
    if ($ArrayA[$i]->Id == $arrayB[$i]->Id) { 
     $getAvailable = $arrayB[$i]->Available; 
    } 
} 

Das Problem:

Da können wir die Situation, wo die Eigenschaft ID in Feld A, Position in einer anderen Position 0 in Array B, das eine andere Struktur haben kann, habe ich keine Ahnung, wie ich auf die Informationen zugreifen kann, die ich benötige (verfügbar), von einem Array, das die IDs von ArrayB und ArrayA vergleicht.

Es tut mir leid wenn ich nicht erklären, es nicht besser, denn es ist ein bisschen schwer in Worte, um diese Situation zu bringen, aber lassen Sie mich wissen, wenn Sie irgendwelche Fragen haben, und bitte, helfen Sie mir, eine Lösung zu finden :)

Wunsch Array sollte wie folgt aussehen:

Array(
[0] => stdClass Object 
(
    [Id] => 123 
    [Size] => small 
    [Color] => yellow 
    [Available] => false 
) 
+0

was die gewünschte * neu * Array aussehen ?? –

+0

Ich habe die Frage bearbeitet und diese Information am Ende hinzugefügt. @ Dagon –

+0

ah ok, das macht Sinn. jede Änderung der ID als der Schlüssel zu beginnen? wenn nicht seine Schleife auf Array eine Suche auf der anderen für jede ID –

Antwort

1
$arr1 = array(
    0 => (object)(array(
     'Id' => '123', 
     'Size' => 'small', 
     'Color' => 'yellow' 
    )), 
    1 => (object)(array 
    (
     'Id' => '456', 
     'Size' => 'large', 
     'Color' => 'red' 
    )), 
    2 => (object)(array 
    (
     'Id' => '789', 
     'Size' => 'medium', 
     'Color' => 'blue' 
    )) 
); 
$arr2 = array(
    0 => (object)(array 
    (
     'Id' => '456', 
     'Size' => 'large', 
     'Color' => 'red', 
     'Available' => 'true' 
    )), 
    1 => (object)(array 
    (
     'Id' => 123, 
     'Size'=> 'small', 
     'Available' => 'false' 
    )), 
    2 => (object)(array 
    (
     'Id' => '789', 
     'Size' => 'medium', 
     'Color' => 'blue', 
     'Available' => 'true' 
    )) 
); 

Erstens: eine neue Variable Array deklarieren, die Ihre neue strukturierte Array später gespeichert werden

$newArr = array(); 

Dazu Schleife Ihre erste Array $ arr1

foreach($arr1 as $row1) { 
} 

dann innerhalb der ersten Schleife Machen Sie eine andere Schleife, die ihre Match-ID aus dem zweiten Array finden $arr2 vergleichen Sie einfach dort ID und wenn es übereinstimmen merge sie

foreach($arr2 as $row2) { 
    if ($row1->Id == $row2->Id) { 
     // do something 
    } 
} 

sie dann schieben, aber bevor Sie sie fusionieren müssen Sie sie in ein assoziatives Array

$newArr[] = array_merge((array)$row1, (array)$row2); 

in Ihr neues Array konvertieren. und halten nur die Sub-Schleife, nachdem Sie es Spiel-ID finden mit

break; 

so Ihre foreach-Schleife würde wie diese

$newArr = array(); 
foreach($arr1 as $row1) { 
    foreach($arr2 as $row2) { 
     if ($row1->Id == $row2->Id) { 
      $newArr[] = array_merge((array)$row1, (array)$row2); 
      break; 
     } 
    } 
} 
+0

Dies wird auf großen Arrays ineffizient sein, aber ok für kleine –

0

Dies ist für ein großes Array nicht effizient ist, aber hier gehen Sie

function getEqual($arrayA, $arrayB){ 

foreach($arrayA as $aIndex => $aData){ 
    $id = $aData['Id']; 
     $aData['Available'] = false; 

    foreach($arrayB as $bIndex => $bData){ 
     if($id == $bData['Id']){ 
      $aData['Available'] = true; 
     } 
    } 

    $arrayA[$aIndex] = $aData; 
} 

return $arrayA; 

}

+0

Was wäre dann effizient? Kannst du mir einen Hinweis auf Techniken geben? (BTW - die letzte geschweifte Klammer rutschte aus dem Codeblock) – lynx