2016-10-25 71 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, 
       ); 

完全解决了该问题。我百分之百认为这是我的第一个解决方案,但其他事情一定会发生,这会让我动弹。