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谢谢您的支持