Php Foreach中的Foreach错误计算

Php Foreach中的Foreach错误计算,php,foreach,Php,Foreach,我有两张桌子。其中一个叫做“客户”,另一个叫做“活期账户” 我想做什么;收集客户表中记录的数据的当前帐户表中的借方和贷方列,并得出结果。但不知怎的,我不能做正确的计算。我在下面留下我的示例代码 提前感谢您的支持 Table Name : Customer Table name : Current Account | tax | company_name |tax_no| debt | take ___________

我有两张桌子。其中一个叫做“客户”,另一个叫做“活期账户”

我想做什么;收集客户表中记录的数据的当前帐户表中的借方和贷方列,并得出结果。但不知怎的,我不能做正确的计算。我在下面留下我的示例代码

提前感谢您的支持

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。

如果$res应包含客户的经常账户余额,则需要将$res的计算移到内部for循环之外,并重置每个客户的债务总额和接受总额:

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

}

我认为您可以在一个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

试试这个。当然,在我看来,我已经修复了您的问题,并用更好的语法编辑了您的代码

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

如果你想计算每家公司的总债务,你应该为每一家新公司重置债务,并移动$res=$sum\u take-$sum\u债务;从内部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

您需要移动
$sum\u debt=0$和取=0
在第一个循环中,因此它会为每个客户重置为什么标记为
.htaccess
?您也可以在查询中计算“余额”。选择customer.company\u name、customer.tax、SUM(current\u account.debt)作为总负债,SUM(current\u account.take)作为总负债,SUM(current\u debt-total\u take)作为客户左侧的余额加入current\u account上的current\u account.tax=客户。按客户划分的税务组。tax谢谢您的支持