2016-07-30 5 views
-1

$ prod_summaryphpの特定の値に対して連想配列を反復できますか?

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は、オーダーの概要と$prod_listが順番に関連した製品のリストを持っていますがあります。最初に、特定の注文の注文サマリ、その注文の下に注文された商品のリストを表示する必要があります。例:

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 

これを達成するために、私はネストされたループを使用していますが、それぞれの外側のループの繰り返しのためのすべての要素のために反復されます内側のループなどの問題があります。以下のコードを参照してください:

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

もっと良い解決策をお探しの人はいらっしゃいますか?私たちは任意のリソースを保存するためにord_id(外側のループから)内部ループを反復できるPHPで任意のオプションがありますか?

+0

申し訳ありません。しかし質問は不明です!あなたは '$ prod_summary'を与えられた' $ prod_list'の中のすべての製品を取得しますか? –

+0

@IsmailRBOUH内部ループは毎回すべての値に対してループしますが、これを避けたいのではなく、外側のループから来る特定の値だけ内部ループを反復することができます。または、もし私が両方のアレイを1つにマージして、同じ出力を得ることができたら(私が示したように)、動作します。 – Ravi

+0

@jWeaver、 'BookName'の値は" prod_list "内で一意であるべきですか? – RomanPerekhrest

答えて

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

call_user_func_arrayarray_merge_recursivearray_keysarray_intersect_key機能を使用してソリューション:

$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)); 
    } 
} 

出力:

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

商品名に加えて列数をさらに少なくしたい場合はどうすればよいですか?必要な変更を提案できますか? – Ravi

+0

@jWeaver、 '$ prod_list'内のそのような「拡張」アイテムの例を表示します – RomanPerekhrest

+0

' Array([0] => Array([ord_id] => 1 [BookName] => My Bookアップデート[tot_qty] => 3 [tot_amt] => 312.78)[1] =>配列([ord_id] => 1 [BookName] => book908 [tot_qty] => 2 [tot_amt] => 32.80))この配列は参考にしてください。 – Ravi

0

は、あなたがあなたの目標を達成するためのカスタム関数を使用することができます。私はあなたが今直面しているような同様の問題に直面しているかもしれない他の人のためにこの機能を作成しました。

/** 

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; 
} 

それはこのように使用することができます...例として、あなたのケースを取っ:

$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>"; 
} 

私はそれをテストできた環境ではないですが、それは完璧に動作するはずです。試してみる。後で将来、たくさんの作業を省くことができます。

+0

現在のソリューションとの違いは何ですか?内側のループに '1000 '行があり、外側に' 100'がある場合。そして、合計反復は「1000x100 = 1,00,000」となります。私は正しい? – Ravi

+0

リスト関数と各関数は、array1とarray2の繰り返し処理を避け、戻り配列を反復処理するのに役立ちます。したがって、ループは内部行の数だけ発生します。すなわち1000回。あなたはそれをテストすることができます。 –

関連する問題