【问题标题】:PHP variable in loop won't set to 0循环中的 PHP 变量不会设置为 0
【发布时间】:2017-03-06 22:38:47
【问题描述】:

所以我有以下方法:

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,以便为下一组准备新的迭代。但是,它似乎没有设置为零。我最终得到了这个:

也许更奇怪的是,如果我删除底部的两个变量,我最终会得到这个:

这让我想知道变量是否被缓存在其他地方。但事实并非如此。这只是令人不安,因为第二个循环有$total_dr$total_cr 具有完全相同的逻辑并且没有问题地重置为零。

我觉得自己想多了,尝试了几种方法。如果有人可以请解释我可能出错的地方,因为我知道我在某个地方。谢谢

编辑:

我正在编辑,因为还有另一个地方正在编辑 $group_dr$group_cr,那就是:

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

但这不应该有效果,因为这是在第二次迭代中。但我想我会指出来

【问题讨论】:

  • 也许将$total_cr$total_dr 添加到您的输出(或日志)中,以确保您获得您期望的值。
  • 感谢您的评论。 $total_dr$total_cr 汇总为 $total。如果你看,这个值实际上在我展示的第一张图片的数组中。你可以看到$total 在其中一个上是1000,它确实改变了$group_dr 的值,这就是想法,但$group_dr 应该在组的开头重置,而不是继续求和,所以在第二组liabilities$group_dr 应该说1000。所以我认为这不是问题。不过谢谢

标签: php loops foreach append


【解决方案1】:

我知道出了什么问题,并且我知道我在某个地方尝试过这个解决方案,但它似乎没有用:

计算$group_dr$group_cr 的行如下:

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

但是,这在检查 $groupData 的 if 语句之外,所以它完全忽略了我们在哪个组,因此它将执行 $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,
                );

彻底解决了这个问题。我有 100% 的把握认为这是我的第一个解决方案,但一定是发生了其他事情,导致我四处移动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2015-02-06
    • 2021-09-26
    • 2014-04-03
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多