即使$value['CardCode'] != $prevCode
为false,此代码也会创建一个数组并添加属性“payment_sum”。您可以看到我正在打印测试值,最后一行509.85正确求和,但根据此if
语句,应该省略之前的数组。
if (($handle = fopen('upload/BEN-new.csv', "r")) === FALSE) {
die('Error opening file');
}
$headers = fgetcsv($handle, 1024, ',');
$cardCodes = array();
$payments = array();
$details = array ();
while ($row = fgetcsv($handle, 1024, ",")) {
$cardCodes[] = array_combine($headers, $row);
}
$prevCode = '';
foreach ($cardCodes as $key => $value) {
if ($value['CardCode'] != $prevCode) {
$payments['payment_sum'] = $value['InvPayAmnt'];
}
else {
$payments['payment_sum'] += $value['InvPayAmnt'];
}
$prevCode = $value['CardCode'];
print_r ($payments);
}
fclose($handle);
打印...
Array
(
[payment_sum] => 1055.40
)
Array
(
[payment_sum] => 550.00
)
Array
(
[payment_sum] => 100.00
)
Array
(
[payment_sum] => 287.33
)
Array
(
[payment_sum] => 509.85
)
首选输出
Array
(
[payment_sum] => 1055.40
)
Array
(
[payment_sum] => 550.00
)
Array
(
[payment_sum] => 100.00
)
Array
(
[payment_sum] => 509.85
Array (
[currTotal] => 287.33
[currTotal] => 222.52
)
)
CSV
BENV1072 1055.4
BENV1073 550
BENV5271 100
BENV5635 287.33
BENV5635 222.52
答案 0 :(得分:1)
每次通过for
循环,您都可以将$payments['payment_sum']
设置为当前行的付款($value['InvPayAmnt']
),或者将行的付款添加到总计中。由于前一个代码与除最后一行之外的所有代码的当前行代码不同,因此您将反复覆盖运行总计。只有最后一行添加到上一行的付款中,结果为509.85
。
您将$payments
视为单值变量而不是数组,因为存储总计的键永远不会更改。您需要使用供应商ID作为密钥。
$payments = array();
foreach ($cardCodes as $key => $value) {
$payments[$value['CardCode']] += $value['InvPayAmnt'];
}
print_r($payments);
<强>输出强>
Array
(
[BENV1072] => 1055.4
[BENV1073] => 550
[BENV5271] => 100
[BENV5635] => 509.85
)
您可以轻松地让$payments
数组跟踪文件中的个别付款以及总数。
$payments = array();
foreach ($cardCodes as $key => $value) {
$payments[$value['CardCode']]['payments'][] = $value['InvPayAmnt'];
$payments[$value['CardCode']]['total'] += $value['InvPayAmnt'];
}
print_r($payments);
答案 1 :(得分:0)
我认为这是因为$value['CardCode']
和$prevCode
都未定义或equivalent。我没有看到你在使用之前设置$prevCode
的任何地方,即使它在你的if
声明中。在代码的顶部,添加error_reporting(-1);
,您可能会收到通知。