Foreach foreach错误计算

时间:2020-09-25 20:45:10

标签: php foreach

我有两个桌子。其中一个称为“客户”,另一个称为“经常帐户”。

我想做;收集客户表中记录的数据的当前帐户表中的借方和贷方列并绘制结果。但是不知何故我无法进行正确的计算。我将示例代码留在下面。

预先感谢您的支持。

Table Name : Customer                    Table name : Current Account

| tax | company_name                     |tax_no| debt | take
______________________                  _________________________
| 1234| Company One                      |1234  | 9    |
| 5678| Company Second                   |1234  |      | 3
                                         |1234  | 15   |
                                         |5678  | 4    |
                                         |5678  |      | 1

根据上表,我要做的是根据客户表中的数据合并当前帐户表中的数据,从应收账款中提取债务并得到结果。

// Data list
$sql = $db->query("SELECT*FROM customer ORDER BY company_name ASC");

$sum_debt = 0;
$sum_take = 0;
foreach($sql->results() as item){

$tax = $item->tax;
$current = $db->query("SELECT*FROM current_account WHERE tax_no = '$tax' ");
foreach($current->results() as $row){
    $sum_debt += $row->debt;
    $sum_take += $row->take;
     
     $res = $sum_take - $sum_debt;
}

}

结果总是错误的。通过对第一个数据进行正确的操作来得出结论。它会收集下一个数据的第一个结果。

应根据表获得的结果;公司一是:-24,公司第二是-3,但是第二个数据是-27。

4 个答案:

答案 0 :(得分:0)

如果$ res应该包含客户的当前帐户余额,则需要将$ res的计算移到内部for循环之外,并为每个客户重置sum_debt和sum_take:

$sql = $db->query("SELECT*FROM customer ORDER BY company_name ASC");

//for loop for each customer
foreach($sql->results() as item){
    
    $sum_debt = 0; //debt of this customer
    $sum_take = 0; //credit of this customer

    $tax = $item->tax;
    $current = $db->query("SELECT*FROM current_account WHERE tax_no = '$tax' ");
    foreach($current->results() as $row){
        $sum_debt += $row->debt;
        $sum_take += $row->take;
    }
     
    $res = $sum_take - $sum_debt; //account balance of this customer

}

您还可以通过直接计算帐户余额来简化代码:

$sql = $db->query("SELECT*FROM customer ORDER BY company_name ASC");

//for loop for each customer
foreach($sql->results() as item){
    
    $balance_of_this_customer = 0;

    $tax = $item->tax;
    $current = $db->query("SELECT*FROM current_account WHERE tax_no = '$tax' ");
    foreach($current->results() as $row){
        $balance_of_this_customer -= $row->debt;
        $balance_of_this_customer += $row->take;
    }

}

答案 1 :(得分:0)

我认为您可以在一个SQL查询中执行此操作,而无需循环查询。

SELECT customer.company_name, customer.tax, SUM(current_account.debt) AS total_debt, SUM(current_account.take) AS total_take FROM customer LEFT JOIN current_account ON current_account.tax_no = customer.tax GROUP BY customer.tax

答案 2 :(得分:0)

尝试一下。我已经解决了您的问题,并以更好的语法编辑了您的代码,当然我个人认为

$data = array();

$customers = $db->query("SELECT * FROM `customer` ORDER BY `company_name` ASC");
$customers = $customers->results();

$result = 0;

foreach($customers as $customer){
    
    if(!isset($data[$customer['id']])){

        $data[$customer['id']] = array(
            'balance' => 0,
            'debt' => 0,
            'take' => 0
        );

    }

    $accounts = $db->query("SELECT * FROM `current_account` WHERE `tax_no` = '" . $customer->tax . "'");
    $accounts = $accounts->results();

    foreach($accounts as $account){

        $data[$customer['id']]['take'] += $row->take;

        $data[$customer['id']]['debt'] += $row->debt;

        $data[$customer['id']]['balance'] = $data[$customer['id']]['take'] - $data[$customer['id']]['debt'];

    }

}

print_r($data);

答案 3 :(得分:0)

如果要计算每个公司的总数,则应重置债务并为每个新公司承担,并移动$ res = $ sum_take-$ sum_debt;从内部foreach到外部foreach的行,并保存每个计算出的公司的结果。

// Data list
$sql = $db->query("SELECT*FROM customer ORDER BY company_name ASC");

$sum_debt = 0;
$sum_take = 0;
foreach($sql->results() as item)
{
    $sum_debt = 0;
    $sum_take = 0;
    $tax = $item->tax;
    current = $db->query("SELECT*FROM current_account WHERE tax_no = '$tax' ");
    foreach($current->results() as $row){
          $sum_debt += $row->debt;
          $sum_take += $row->take;
    }
    $res = $sum_take - $sum_debt;
    //Save or print res
    echo $tax . " has debt: " . $res; 
}

我也强烈建议您在第一个SQL查询中检索所有必要的计算数据。每个公司进行查询可能会很昂贵,并且会导致性能下降。 SQL类似于:

SELECT c.tax, 
       c.company_name, 
       (SELECT SUM(take) FROM [Current Amount] WHERE tax_no = tax) - 
       (SELECT SUM(debt) FROM [Current Amount] WHERE tax_no = tax) AS [res] 
FROM Company