2016-07-30 29 views
-1

$ prod_summaryKönnen wir assoziatives Array für bestimmte Werte in PHP iterieren?

Array ([0] => Array ([ord_id] => 1 [userid] => 1 [tot_qty] => 5 [tot_act_amt] => 239.28)) 

$ prod_list

Array ([0] => Array ([ord_id] => 1 [BookName] => My Book update) [1] => Array ([ord_id] => 1 [BookName] => book908)) 

$prod_summary werden, um Zusammenfassung haben und $prod_list werden Liste mit zugeordnet, um Produkte. Zuerst sollte die Bestellzusammenfassung für einen bestimmten Auftrag angezeigt werden und dann die Liste der Produkte, die unter diesem Auftrag bestellt wurden. Beispiel:

Order Id: 1 
Product Name : Book1 
Product Name : Book2 
Order Id: 2 
Product Name : Book1 
Product Name : Book4 
Order Id: 3 
Product Name : Book3 
Product Name : Book4 

Um dies zu erreichen, ich bin mit verschachtelter Schleife, aber es gibt Problem als innere Schleife wird für jedes Element für jede Außenschleifeniteration laufen. Siehe unten Code:

foreach ($prod_summary as $summary) { 
echo 'Order Id :'.$summary['ord_id']; 
foreach ($prod_list as $prod) { // this loop will iterate for all element 
    if($prod['ord_id']==$summary['ord_id']){ // comparing ord_id from outer loop 
     echo 'Product Name '.$prod['BookName']; 
     } 
    } 
} 

Kann jemand bessere Lösung vorschlagen? Haben wir irgendeine Option in PHP, mit der ich innere Schleife für spezifische ord_id (von der äußeren Schleife) iterieren kann, um etwas Ressource zu sparen?

+0

Entschuldigung! aber die Frage ist unklar !! Möchtest du alle Produkte in '$ prod_list' mit einem' $ prod_summary' erhalten? –

+0

@ IsmailRBOUH innere Schleife wird jedes Mal für alle Werte Schleife, ich wollte dies zu vermeiden, statt, wenn ich innere Schleife für nur bestimmte Wert, die von äußeren Schleife kommen könnte. Oder wenn ich beide Array zu einem zusammenführen könnte und dieselbe Ausgabe bekommen könnte (wie ich gezeigt habe), wird auch funktionieren. – Ravi

+0

@jWeaver, sollte 'BookName' in" prod_list "eindeutig sein? – RomanPerekhrest

Antwort

0
foreach($prod_list as $item){ 
    $pNames[$item['ord_id']] = $item['BookName']; 
} 
foreach ($prod_summary as $summary) { 
    echo 'Order Id :'.$summary['ord_id'].'<br>' 
    'Product Name '.$pNames[$summary['ord_id']]; 
} 
0

Die Lösung mit call_user_func_array, array_merge_recursive, array_keys und array_intersect_key Funktionen:

$prod_summary = Array(
    0 => Array('ord_id' => 1, 'userid' => 1, 'tot_qty' => 5, 'tot_act_amt' => 239.28) 
); 
$prod_list = Array(
    0 => Array('ord_id' => 1, 'BookName' => 'My Book update'), 
    1 => Array('ord_id' => 1, 'BookName' => 'book908'), 
    2 => Array('ord_id' => 2, 'BookName' => 'book909'), 
    3 => Array('ord_id' => 1, 'BookName' => 'book908') 
); 

// getting grouped list of order ids and booknames with relative positions at once 
$groups = call_user_func_array("array_merge_recursive", $prod_list); 

foreach ($prod_summary as $summary) { 
    echo 'Order Id :' . $summary['ord_id'] . PHP_EOL; 
    $ord_keys = array_keys($groups['ord_id'], $summary['ord_id']); 

    // outputing booknames only if there's a needed 'ord_id' within $groups array 
    if (!empty($ord_keys) && $booknames = array_intersect_key($groups['BookName'], array_flip($ord_keys))) { 
     echo implode("", array_map(function($v){ return 'Product Name '. $v. PHP_EOL; }, $booknames)); 
    } 
} 

Der Ausgang:

Order Id :1 
Product Name My Book update 
Product Name book908 
Product Name book908 
+0

Was, wenn ich mehr Spalten neben dem Produktnamen zeigen wollte? Könnten Sie bitte die erforderlichen Änderungen vorschlagen? – Ravi

+0

@jWeaver, zeigen Sie mir ein Beispiel für solch ein "erweitertes" Objekt in '$ prod_list' – RomanPerekhrest

+0

' Array ([0] => Array ([ord_id] => 1 [BuchName] => Mein Buch update [tot_qty] => 3 [tot_amt] => 312.78) [1] => Array ([ord_id] => 1 [BuchName] => book908 [tot_qty] => 2 [tot_amt] => 32.80)) 'Bitte beziehen Sie sich auf dieses Array als Referenz. – Ravi

0

Sie können eine benutzerdefinierte Funktion verwenden, um Ihr Ziel zu erreichen. Ich habe diese Funktion für andere erstellt, die ähnliche Probleme haben könnten, wie Sie es jetzt tun.

/** 

A PHP function to iterate loop for specific value gotten from another array... 

@param array1 = main array we are matching against, 
@param array2 = array with which we are checking for values matching one in array1. 
@param key = the key we expect to see in array2 that exists in array1. 
*/ 
function array_match_key($array1 = [], $array2 = [], $key = null){ 
    $result = []; 
    while(list($var1, $val1) = each($array1)){ 
     while(list($var2, $val2) = each($array2)){ 
      if($val1[$key] == $val2[$key]){ 
       $result = array_merge($result, $val2); 
      } 
     } 
    } 
    return $result; 
} 

Es kann wie folgt verwendet werden ... Ihren Fall als Beispiel genommen:

$matches = array_match_key($prod_summary, $prod_list, "ord_id"); 
foreach($matches as $prod){ 
    echo 'Order Id :'.$prod['ord_id']."<br>"; 
    echo 'Product Name '.$prod['BookName']."<br>"; 
} 

Ich bin nicht in einer Umgebung, wo ich es getestet könnte, aber es sollte einwandfrei funktionieren. Versuche es. Kann Ihnen später viel Arbeit ersparen.

+0

Was unterscheidet meine aktuelle Lösung? Wenn Ihre innere Schleife '1000' Reihen hat und äußere '100'. Dann wäre die gesamte Iteration "1000x100 = 1,00,000". Habe ich recht ? – Ravi

+0

Sowohl die Listenfunktion als auch die einzelnen Funktionen helfen Ihnen, die Iteration über array1 und array2 zu vermeiden, statt dessen über ihr Rückgabearray zu iterieren. Daher wird die Schleife nur nach der Anzahl der inneren Zeilen auftreten. d.h. 1000 mal. Sie können es ausprobieren. –