2017-08-12 2 views
0

Ich habe die folgenden zwei stdClass-Array aus einer Schleife. Jetzt muss ich sie zusammenführen, wenn der Schlüssel "id" übereinstimmt.Merge zwei stdClass Objekt-Array in PHP

array (size=1) 
    0 => 
    object(stdClass)[28] 
     public 'id' => string '78' (length=2) 
     public 'quantity' => string '5' (length=1) 




array (size=1) 
    1 => 
    object(stdClass)[31] 
     public 'product_id' => string '78' (length=2) 
     public 'quantity' => string '1' (length=1) 

Also das letzte Array

array (size=1) 
    1 => 
    object(stdClass)[31] 
     public 'product_id' => string '78' (length=2) 
     public 'quantity' => string '6' (length=1) 

Alle auf Hilfe worden, wie das zu tun? Ich dekodiere die ursprünglichen Daten mit json_decode von [{"id":"78","quantity":"1"}] dieses Format von Daten.

+0

Sind Array1 und Array2 eine Datenbankergebnismenge? Haben Sie versucht, das erste Array zu loopen und das zweite Array zu mappen? – DanielO

+0

Ja, sie sind Datenbankergebnissatz. Sie sind im Grunde serialisierte Zeichenfolge in der Datenbank, die, wenn gezogen wird, sind json_decode. Sie sind von der gleichen Schleife. –

Antwort

0

Wenn Sie dem json_decode einen zusätzlichen Parameter hinzufügen, können Sie die Daten als assoziatives Array abrufen, mit dem Sie viel einfacher arbeiten können. Ich habe ein paar Versionen (die erste ist PHP 7) gemacht, wählen Sie eine, die mit Ihrem System funktioniert.

<?php 
error_reporting (E_ALL); 
ini_set ('display_errors', 1); 

$arr1 = json_decode('[{"id":"78","quantity":"1"}, {"id":"79","quantity":"3"}]', true); 
$arr2 = json_decode('[{"id":"78","quantity":"5"}]', true); 

$arr3 = array_merge($arr1, $arr2); 

// V7 
$result = []; 
foreach ($arr3 as $element) { 
    $result[$element['id']] = ($result[$element['id']]??0) 
       + $element['quantity']; 
} 

print_r($result); 
// Prior to V7 
$result = array(); 
foreach ($arr3 as $element) { 
    if (!isset($result[$element['id']])){ 
     $result[$element['id']] = 0; 
    } 
    $result[$element['id']] += $element['quantity']; 
} 

print_r($result); 

Ich habe ein weiteres Element hinzugefügt zu zeigen, wie dies summiert sich, aber der Ausgang dieses ist ...

Array 
(
    [78] => 6 
    [79] => 3 
) 
Array 
(
    [78] => 6 
    [79] => 3 
) 
+0

Perfekte Lösung. Vielen Dank ! –

0

Hier ist eine Lösung, die das Format in Ihrer ursprünglichen Frage unterhält. Es verwendet auch array_reduce, die eine übersichtliche Methode zum Verarbeiten eines Arrays ist.

<?php 
$input1 = '[{"id":"78","quantity":"7800"}, 
    {"id":"79","quantity":"7900"}, 
    {"id":"80","quantity":"8000"}]'; 
$input2 = '[{"id":"78","quantity":"6"}, 
    {"id":"79","quantity":"8"}, 
    {"id":"80","quantity":"6"}, 
    {"id":"81","quantity":"7"}]'; 

$input1Arr = json_decode($input1); 
$input2Arr = json_decode($input2); 

$combinedArrays = array_merge($input1Arr, $input2Arr); 

echo "combinedArrays = " . print_r($combinedArrays, true) . "\n"; 

$result = array_reduce($combinedArrays, 
    function($intermediateResult, $item){ 
     if (! array_key_exists($item->id, $intermediateResult)) { 
      // First time encountering an object with this id 
      $intermediateResult[$item->id] = $item; 
     } 
     else { 
      // We have an object with this id already so just add the quantity 
      $intermediateResult[$item->id]->quantity += $item->quantity; 
     } 
     return $intermediateResult; 
    }, []); 
// Get the values from the result array 
print_r(array_values($result)); 
+0

Arbeitete wie ein Charme. Vielen Dank ! –