我们可以在php中迭代特定值的关联数组吗?
$prod\u摘要我们可以在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]
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])
请参考此阵列以供参考。