2016-10-25 118 views
1

所以我有以下方法:PHP變量不會設置爲0

public function generateTrialBalance($period) { 
    $total_dr = 0; 
    $total_cr = 0; 
    $date  = NULL; 

    $group_dr = 0; 
    $group_cr = 0; 

    $accountData = $this->find(); 

    $groupData = $this->findAllGroups(); 

    foreach($groupData as $accountGroup) { 

     foreach($accountData as $ledger) {   

      $group = $this->findGroup($ledger['group_id']); 

      $ledgerFormat = gl_format($ledger['gl_account_main'], $ledger['gl_account_dept'], $ledger['gl_account_sub']); 
      $ledgerEntries = $this->findLedgerEntries($ledger['id']); 

      foreach($ledgerEntries as $entries) { 
       $journalData = $this->findJournalEntry($entries['entry_id']);    
       $date  = date('m', $journalData['date']); 

       if ($date <= $period) { 
        $position = $entries['position']; 
        $amount = $entries['amount']; 
        $position == "D" ? $total_dr += $amount : $total_cr += $amount; 
       }   
      } 

      $total = $total_dr - $total_cr; 

      $total > 0 ? $group_dr += $total : $group_cr +=$total; 

      if($accountGroup['id'] == $group['id']) { 
       $this->ledgerTable[$group['name']][] = array(
         "account"   => $ledgerFormat, 
         "description"  => $ledger['name'], 
         "total"    => $total, 
         "group_dr"   => $group_dr, 
         "group_cr"   => $group_cr, 
       ); 

      } 
      $total_dr = 0; 
      $total_cr = 0; 
     } 

     $group_dr = 0; // Here is where the issue needs resolving 
     $group_cr = 0; // Resetting the variables to prepare for next iter 
} 

    return $this->ledgerTable; 
} 

爲了讓一個想法,什麼我的一些變量包含或做什麼,$groupData有9行。 $accountData大約有33行

我的目標是爲$groupData每次迭代,找到$accountData匹配$groupData這一點,然後追加到基於結果的新數組行。我得到一個數組,看起來像這樣:

array(
    "Group1" => array(
       array(
       "account"  => 'string'; 
       "description" => 'string'; 
       "total"  => 'float'; 
       "group_dr" => 'float'; 
       "group_cr" => 'float'; 
      ), 
       array(
       "account"  => 'string'; 
       "description" => 'string'; 
       "total"  => 'float'; 
       "group_dr" => 'float'; 
       "group_cr" => 'float'; 
      ) 
     ), 
    "Group2" => array(
       array(
       "account"  => 'string'; 
       "description" => 'string'; 
       "total"  => 'float'; 
       "group_dr" => 'float'; 
       "group_cr" => 'float'; 
      ), 
       array(
       "account"  => 'string'; 
       "description" => 'string'; 
       "total"  => 'float'; 
       "group_dr" => 'float'; 
       "group_cr" => 'float'; 
      ) 
     ), 

一切完美的作品,除了當$groupData第一次迭代完成時,$group_dr$group_cr設置爲0,以準備爲新的迭代的關鍵時刻下一組。但是,它似乎沒有設置爲零。我結束了與此:

strangeness

甚至怪異,如果我刪除這兩個變量在底部我結束了這一點:

evenweirder

這讓我想知道變量被緩存在其他地方。但事實並非如此。這只是令人沮喪,因爲第二個循環有$total_dr$total_cr具有完全相同的邏輯,並重置爲零而沒有問題。

我覺得我一直在推翻,並嘗試了幾種方法。如果任何人都可以請解釋我可能會出錯的地方,因爲我知道我在某個地方。謝謝

編輯:

我的編輯,因爲存在這樣的情況$group_dr$group_cr正在編輯另一個地方,那就是在:

$total > 0 ? $group_dr += $total : $group_cr +=$total; 

但是這不應該有效果,因爲這是在第二次迭代中。但我想我會指出來

+1

也許在輸出(或日誌)中添加'$ total_cr'和'$ total_dr',以確保您獲得您期望的值。 – Luke

+0

感謝您的評論。 '$ total_dr'和'$ total_cr'被彙總爲$ total。如果你看,這個值實際上是在我展示的第一幅圖像的數組中。你可以看到'$ total'在其中一個位置是'1000',它確實改變了'$ group_dr'的值,這就是想法,但是'$ group_dr'應該在組的開頭重置,而不是繼續求和,所以在第二組「負債」中,「$ group_dr」應該只是說'1000'。所以我不認爲這是問題。不過謝謝 – Juan

回答

2

我想通了,什麼是錯的,我知道我的地方嘗試這個解決方案的路線,它似乎並沒有工作:

其中$group_dr$group_cr被計算的行在如下:

$total > 0 ? $group_dr += $total : $group_cr +=$total; 

然而,這是檢查$groupData if語句之外,因此它完全忽略了我們什麼組ERGO它會做的$accountData全面迭代並從中總結了一切,這這就是爲什麼我不斷收到那些複製品工商業污水附加費。但是,如果在以下if語句中插入此內容:

  if($accountGroup['id'] == $group['id']) { 
      $total > 0 ? $group_dr += $total : $group_cr +=$total; // it works 
       $this->ledgerTable[$group['name']][] = array(
         "account"   => $ledgerFormat, 
         "description"  => $ledger['name'], 
         "total"    => $total, 
         "group_dr"   => $group_dr, 
         "group_cr"   => $group_cr, 
       ); 

完全解決了該問題。我百分之百認爲這是我的第一個解決方案,但其他事情一定會發生,這會讓我動彈。