2016-10-25 2 views
1

So habe ich die folgende Methode:PHP-Variable in der Schleife nicht auf 0 gesetzt

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; 
} 

Um eine Vorstellung zu geben, was einige meiner Variablen enthalten oder tun, $groupData hat 9 Zeilen. $accountData hat etwa 33 Zeilen

Mein Ziel für jede Iteration von $groupData ist, die Zeilen in $accountData finden, die $groupData passen und dann in ein neues Array die Erkenntnis zugrunde, hängen. Ich bekomme ein Array, das wie folgt aussieht:

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'; 
      ) 
     ), 

Alles perfekt außer für den kritischen Moment funktioniert, wenn die erste Iteration von $groupData beendet hat, die $group_dr und $group_cr auf 0 gesetzt, um eine neue Iteration für die Vorbereitung nächste Gruppe. Es scheint jedoch nicht auf Null gesetzt zu sein. Und ich am Ende mit auf den Punkt:

strangeness

Vielleicht noch seltsamer, wenn ich die beiden Variablen am Boden entferne ich mit diesem Ende:

evenweirder

Was mich, wenn die sich fragen Die Variable wird irgendwo anders zwischengespeichert. Aber es ist nicht. Es ist nur ärgerlich, weil die zweite Schleife hat $total_dr und $total_cr mit der gleichen Logik und Nullsetzen ohne Problem.

Ich fühle mich wie ich habe übertrieben und habe mehrere Methoden ausprobiert. Wenn irgendjemand bitte erklären könnte, wo ich möglicherweise schief gehe, weil ich weiß, dass ich irgendwo bin. Danke

EDIT:

Ich bin der Bearbeitung, weil es einen anderen Ort, wo $group_dr und $group_cr bearbeitet wird, und das ist in:

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

Dies sollte jedoch keine Auswirkungen haben, denn dies ist in der zweiten Iteration. Aber ich dachte, ich es darauf hinweisen würde

+1

Fügen Sie Ihrer Ausgabe (oder einem Protokoll) möglicherweise die Werte "$ total_cr" und "$ total_dr" hinzu, um sicherzustellen, dass Sie die Werte erhalten, die Sie dort erwarten. – Luke

+0

Danke für Ihren Kommentar. '$ total_dr' und' $ total_cr' werden in $ total zusammengerollt. Wenn Sie schauen, ist der Wert tatsächlich in dem Array auf dem ersten Bild, das ich zeigte. Sie können sehen, wo '$ total' auf einem von ihnen' 1000' ist und es ändert den Wert von '$ group_dr', das ist die Idee aber' $ group_dr' sollte am Anfang der Gruppe zurückgesetzt werden, nicht weiter summieren In der zweiten Gruppe "Verbindlichkeiten" sollte "$ group_dr" einfach "1000" sagen. Also ich denke nicht, dass das das Problem ist. Trotzdem danke – Juan

Antwort

2

ich herausgefunden, was falsch ist, und ich weiß, dass ich versuchte, diese Lösung irgendwo auf der ganzen Linie und es scheint nicht zu funktionieren:

Die Linie, wo $group_dr und $group_cr berechnet wird in ist die folgende:

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

dies ist jedoch außerhalb des if-Anweisung, die die $groupData prüft, so ignoriert sie vollständig zu welcher Gruppe sind wir in ergo es wird die vollständige Iteration von $accountData und Tally alles bis tun, was Deshalb erhalte ich diese Duplikate tes. Das Einfügen in die folgende if-Anweisung:

  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, 
       ); 

Das Problem wurde vollständig behoben. Ich bin einhundert Prozent, dass dies meine ERSTE Lösung war, aber etwas anderes muss passiert sein, dass ich Dinge bewegen muss.

Verwandte Themen