【问题标题】:Can we iterate associative array for specific value in php?我们可以为 php 中的特定值迭代关联数组吗?
【发布时间】:2016-07-30 18:14:51
【问题描述】:

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

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

谁能提出更好的解决方案?我们在 php 中是否有任何选项可以让我迭代 inner loop 以获取特定的 ord_id(来自外部循环)以节省一些资源?

【问题讨论】:

  • 对不起!但问题不清楚!给定$prod_summary,您想获得$prod_list 中的所有产品吗?
  • @IsmailRBOUH 内循环每次都会循环所有值,我想避免这种情况,而是如果我可以只为特定值迭代内循环,这将来自外循环。或者,如果我可以将两个数组合并为一个并且可以获得相同的输出(如我所示),也可以工作。
  • @jWeaver,BookName 值在“prod_list”中是否应该是唯一的?
  • @RomanPerekhrest No. BookName 是与 ord_id 关联的产品名称。它可以是重复的,但不是特定的ord_id。对于每个ord_idBookName 将是unique 或者换句话说,ord_id=1 不能有重复的BookName 条目。
  • 这个问题不是很清楚。你到底想达到什么目标?

标签: php for-loop associative-array


【解决方案1】:
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']];
}

【讨论】:

    【解决方案2】:

    使用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
    

    【讨论】:

    • 如果我想显示更多的列以及产品名称怎么办?能否建议所需的更改?
    • @jWeaver,给我看一些$prod_list中这种“扩展”项目的例子
    • Array ( [0] =&gt; Array ( [ord_id] =&gt; 1 [BookName] =&gt; My Book update [tot_qty] =&gt; 3 [tot_amt] =&gt; 312.78) [1] =&gt; Array ( [ord_id] =&gt; 1 [BookName] =&gt; book908 [tot_qty] =&gt; 2 [tot_amt] =&gt; 32.80) ) 请参考此数组以供参考。
    【解决方案3】:

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

    /**
    
    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>";
    }
    

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

    【讨论】:

    • 与我当前的解决方案有何不同。如果您的内部循环将有1000 行,而外部将有100。然后,总迭代将是1000x100=1,00,000。我说的对吗?
    • list 函数和 each 函数都可以帮助您避免对 array1 和 array2 的迭代,而是对它们的返回数组进行迭代。因此,循环只会按内部行数发生。即1000次。你可以测试一下。
    猜你喜欢
    • 2013-12-14
    • 2019-05-11
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 2020-07-26
    相关资源
    最近更新 更多