2

此代码创建一个数组并添加属性“payment_sum”,即使$value['CardCode'] != $prevCode为 false。您可以看到我正在打印用于测试的值,最后一行 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
4

2 回答 2

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);
于 2012-06-05T20:54:52.840 回答
0

我认为这是因为两者$value['CardCode']都是$prevCodeundefined 或等价的。我没有看到你$prevCode在使用它之前设置的任何地方,即使它在你的if声明中。在你的代码顶部,放error_reporting(-1);,你可能会看到一个通知。

于 2012-06-05T20:32:01.773 回答