【问题标题】:How can I loop through this array?我怎样才能遍历这个数组?
【发布时间】:2017-01-09 11:17:15
【问题描述】:

我有一个来自数据库的数组,我想循环访问,并且 item_id 相同,添加 qty(quantity) 以获得总数量。我尝试使用 while 循环进入内部数组,其中最大计数由 count(outer array) 确定,但这并没有给我带来想要的结果。

这是数组:

Array
(
    [0] => Array
        (
            [id] => 8
            [lpo_id] => 20
            [invoice_no] => 1483958702
            [external_invoice_no] => 1
            [item_id] => 21
            [qty] => 14
            [currency] => USD
            [price] => 1.31
            [date] => 1483909200
            [supplier_id] => 9
        )

    [1] => Array
        (
            [id] => 9
            [lpo_id] => 20
            [invoice_no] => 1483958702
            [external_invoice_no] => 1
            [item_id] => 22
            [qty] => 15
            [currency] => USD
            [price] => 2.52
            [date] => 1483909200
            [supplier_id] => 9
        )

)

这是数据库查询:

public function getSupplierInvoiceByRefNo($ourRef) {
  $sql = "SELECT * FROM `{$this->_table_20}` WHERE `invoice_no` = '$ourRef'";
  return $this->db->fetchAll($sql);
}

public function fetchAll($sql) {
    $result = $this->query($sql);
    $out = array();
    while($row = mysqli_fetch_assoc($result)) {
        $out[] = $row;
    }
    mysqli_free_result($result);
    return $out;
}

数据库表:

id | lpo_id | invoice_no | external_invoice_no | item_id | qty | currency | price | date | supplier_id

期望的输出是具有下表,其中具有相同 item_id 的行项目具有总计数量并且在输出表中仅显示一次

item_id | qty | price | currency

【问题讨论】:

  • 无法得到您的问题您想要的输出是什么?
  • 抱歉,我没有看到您说您尝试过的 php 代码。如果您不发布,您希望我们如何提供帮助?
  • 为什么list()在低于7的php版本中不可用?
  • 我想说,您可以通过更改在数据库上运行的查询来为您完成这一切,从而更快、更简单地完成此操作。发布您的查询。总是尝试修复错误的根源,将垃圾放入好的数据是一种不好的做法
  • $final_sum = array(); foreach ($array as $arr){ $final_sum[$arr['item_id']] = $final_sum[$arr['item_id']]+$arr['qty']]; } echo "<pre/>";print_r($final_sum);

标签: php


【解决方案1】:

试试下面的代码:

foreach($arrays as $a) 
{
   foreach ($a as $key => $value) 
       echo $key . '=' . $value;
}

祝你好运。

【讨论】:

  • 修复查询以正确选择会更简单
【解决方案2】:

这个查询应该产生你所追求的

SELECT item_id, SUM(qty) as qty, price, currency 
FROM `{$this->_table_20}` 
WHERE `invoice_no` = '$ourRef'
GROUP BY item_id";

【讨论】:

    【解决方案3】:

    你可以试试这样的

    $data = array(
    array('id'=>1,'item_id'=>2,'qty'=>13),
    array('id'=>2,'item_id'=>3,'qty'=>16),
    array('id'=>3,'item_id'=>2,'qty'=>33),
    array('id'=>3,'item_id'=>3,'qty'=>43),
    array('id'=>3,'item_id'=>4,'qty'=>30));
    
    $new = array();
    foreach($data as $value){
    if($new[$value['item_id']]){
        $new[$value['item_id']]+= $value[qty];
    }else{
      $new[$value['item_id']] = $value['qty'];
    }
    
    }echo "<pre>";print_r($new);
    

    输出

    Array
    (
        [2] => 46
        [3] => 59
        [4] => 30
    )
    

    【讨论】:

    • 修复查询以正确选择会更简单
    【解决方案4】:

    我想你想要这样:-

    $final_sum = array();
    
    foreach ($array as $arr){
      $final_sum[$arr['item_id']] += $arr['qty']];
    }
    
    echo "<pre/>";print_r($final_sum); // will give you an array of keys = item_id and values = sum of those id's quantities from original array
    

    注意:- 如果您按照@RiggsFolly 的建议使用SUM() 进行查询,这将非常容易

    【讨论】:

    • 修复查询以正确选择会更简单
    • @RiggsFolly 同意
    • 如果可能的话,我也更喜欢查询替代方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    相关资源
    最近更新 更多