我们可以在php中迭代特定值的关联数组吗?

我们可以在php中迭代特定值的关联数组吗?,php,for-loop,associative-array,Php,For Loop,Associative Array,$prod\u摘要 Array ( [0] => Array ( [ord_id] => 1 [userid] => 1 [tot_qty] => 5 [tot_act_amt] => 239.28)) $prod\u列表 Array ( [0] => Array ( [ord_id] => 1 [BookName] => My Book update) [1] => Array ( [ord_id] => 1 [BookName]

$prod\u摘要

Array ( [0] => Array ( [ord_id] => 1 [userid] => 1 [tot_qty] => 5 [tot_act_amt] => 239.28))
$prod\u列表

Array ( [0] => Array ( [ord_id] => 1 [BookName] => My Book update) [1] => Array ( [ord_id] => 1 [BookName] => book908) )
$prod\u summary
将具有订单摘要,
$prod\u 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'];
      }
   }
}
有人能提出更好的解决方案吗?我们在php中是否有任何选项,通过该选项,我可以迭代内部循环以获取特定的
ord\u id
(从外部循环)以节省一些资源?

foreach($prod\u list as$item){
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']];
}
$pNames[$item['ord_id']]=$item['BookName']; } foreach($prod_汇总为$summary){ 回显“订单Id:”.$summary['ord_Id']。
' “产品名称”。$pNames[$summary['ord_id']; }
使用
调用用户函数数组
数组合并递归
数组键
数组相交键
函数的解决方案:

$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

您可以使用自定义函数来实现您的目标。我为其他可能面临类似问题的人创建了此功能,就像您现在面临的问题一样

/**

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>";
}
$matches=array\u match\u key($prod\u summary,$prod\u list,“ord\u id”);
foreach($匹配为$prod){
回显“订单Id:”.$prod['ord_Id']。“
”; 回显“产品名称”。$prod['BookName']。“
”; }

我不是在一个可以测试它的环境中,但它应该可以完美地工作。试试看。以后可能会为您节省大量工作。

对不起!但问题还不清楚!!如果给定一个
$prod\u摘要
,您想得到
$prod\u列表中的所有产品吗?@IsmailRBOUH内部循环每次都会对所有值进行循环,我想避免这种情况,如果我可以只对来自外部循环的特定值迭代内部循环的话。或者,如果我可以将两个数组合并为一个数组,并且可以获得相同的输出(如我所示),也可以使用。@jWeaver,“产品列表”中的
BookName
值是否应该唯一?@RomanPerekhrest No.
BookName
是与
ord\u id
关联的产品名称。它可以是重复的,但不在特定的
ord\u id
中。对于每个
ord\u id
BookName
将是
唯一的
,或者换句话说,
ord\u id=1
不能有重复的
BookName
条目。这个问题不是很清楚。你到底想实现什么?我目前的解决方案有什么不同。如果您的内部循环将有
1000
行,而外部循环将有
100
。然后,总迭代将是
1000x100=100000
。我说的对吗?list函数和each函数都可以帮助您避免在array1和array2上迭代,而是在它们的返回数组上迭代。所以,循环只会按内部行的数量发生。i、 e.1000次。你可以测试一下。如果我想在产品名称旁边再显示几列呢?请给出所需更改的建议?@jWeaver,给我展示一下
$prod\u list
Array([0]=>Array([ord\u id]=>1[BookName]=>1[BookName]=>1[BookName]=>mybook update[tot\u qty]=>3[tot\u amt]=>312.78][1]=>Array([ord id]=>1[BookName]=>book908[tot\u amt]=>2[tot\u amt]=>32.80])
请参考此阵列以供参考。