2012-06-05 4 views
2

이 코드는 $value['CardCode'] != $prevCode이 false 인 경우에도 배열을 생성하고 'payment_sum'속성을 추가합니다. 테스트 값, 즉 509.85의 합계를 갖는 마지막 줄을 인쇄하고 있지만 배열은이 if 문에 따라 생략되어야합니다.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

왜 'BENV5635'전에 모든 지불금을 내고 있습니까? 예를 들어 입력 파일에'BENV5627 23.54'를 추가하면 "total"지불은'23.54'가됩니다. 그게 니가 원하는거야? –

+0

나는 내가 잘 설명하지 않는다고 생각한다. 기본적으로 공급 업체 ID ie : BENxxxx에 의해이 배열을 그룹화하고 해당 그룹의 총 금액을 표시하려고합니다. 보시다시피 CSV의 마지막 2는 함께 그룹화되어 합계 509.85 만 표시되어야합니다. – user1413248

+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); 
+0

기본 출력을 추가했습니다. – user1413248

+0

합산해야하는 금액이 여러 개인 경우 하나의 지불 만있는 경우 합계가됩니다. – user1413248

+0

위 내용은 고유 한 공급 업체 코드 당 하나의 지불 총계를 제공합니다. –

0

내가 모두 $value['CardCode']$prevCode가 정의되지 않았거나 01 중 하나이기 때문에 그것의 가정 것. if 문에 있더라도 사용하기 전에 $prevCode을 설정 한 곳은 어디에도 없습니다. 코드 상단에 error_reporting(-1);을 입력하면 통지가 표시됩니다.

+0

초기화와 error_reporting을 추가했지만 아무것도 변경되지 않았습니다. – user1413248

+0

'ini_set ('display_errors', 1);'을 추가하거나 오류 로그 파일을 체크인하십시오. – Mike

+0

내 논리가 올바른 이유는 다음과 같습니다. if ($ value [ 'CardCode']! = $ prevCode) { $ value [ 'InvPayAmnt']; 인쇄 '
'; } 반복되는 값만 생략합니다. 하지만 내가 이렇게 할 때 어떤 이유로 $ payments [ 'payment_sum'] = $ value [ 'InvPayAmnt']; 두 배열을 다시 인쇄합니다. – user1413248

관련 문제