Bernd: Wie rechnet hier PHP?

Hallo,

ich verstehe es gerade einfach nicht

foreach($zeiterfassung as $array_1){ 

  //echo $array_1['anzStunden'] . "<br>";

    $anzStunden =   str_replace(",", ".", $array_1['anzStunden']);
    echo $anzStunden . "<br>";
            
    $gesamtZeit   += $anzStunden;

}

Behauptet PHP es seien 15.5 Stunden, was schlicht weg falsch ist. echo $anzStunden ergibt folgenes

0.75
1.25
1
3
0.75
1
1.75

Macht zusammen 9.5 Stunden. Wie kommt PHP also auf 15.5 Stunden?

  1. Aloha ;)

    Wie kommt PHP also auf 15.5 Stunden?

    Weiß ich nicht.

    Mit folgendem Code:

    <?php
    
    $zeiterfassung = Array(
    	['anzStunden' => "0,75"],
    	['anzStunden' => "1,25"],
    	['anzStunden' => "1"],
    	['anzStunden' => "3"],
    	['anzStunden' => "0,75"],
    	['anzStunden' => "1"],
    	['anzStunden' => "1,75"]
    );
    
    $gesamtZeit = 0;
    
    foreach($zeiterfassung as $array_1){ 
    
      //echo $array_1['anzStunden'] . "<br>";
    
        $anzStunden =   str_replace(",", ".", $array_1['anzStunden']);
        echo $anzStunden . "<br>";
                
        $gesamtZeit   += $anzStunden;
    
    }
    
    echo '<hr>';
    echo $gesamtZeit;
    
    

    kommt http://phptester.net/ auf das korrekte Ergebnis.

    Vermutlich hast du folgende Zeile vergessen:

    $gesamtZeit = 0;
    

    ...und arbeitest mit einem irgendwie initialisierten Wert.

    Grüße,

    RIDER

    --
    Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
    # Twitter # Steam # YouTube # Self-Wiki # Selfcode: sh:) fo:) ch:| rl:) br:^ n4:? ie:% mo:| va:) js:) de:> zu:} fl:( ss:) ls:[
    1. Hallo,

      Vermutlich hast du folgende Zeile vergessen:

      $gesamtZeit = 0;
      

      ...und arbeitest mit einem irgendwie initialisierten Wert.

      ich hatte es zwar nicht vergessen aber an einer falschen Stelle platziert. Was mich dennoch wundert wie kommt PHP auf so eine Zahl und sagt nicht, dass ich etwas vergessen habe. Mit welchem Wert fängt PHP an zu rechnen wenn man nichts angibt?

      1. Aloha ;)

        ich hatte es zwar nicht vergessen aber an einer falschen Stelle platziert. Was mich dennoch wundert wie kommt PHP auf so eine Zahl und sagt nicht, dass ich etwas vergessen habe. Mit welchem Wert fängt PHP an zu rechnen wenn man nichts angibt?

        Hättest du es vergessen hätte PHP gemeckert. Du hast es ja offensichtlich nicht vergessen - daher hat PHP einfach den Wert genommen, den du da reingeschrieben hast.

        Woher soll PHP wissen, dass du einen Fehler gemacht hast? Du hättest das ja auch so meinen können wie du programmiert hast.

        Grüße,

        RIDER

        --
        Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
        # Twitter # Steam # YouTube # Self-Wiki # Selfcode: sh:) fo:) ch:| rl:) br:^ n4:? ie:% mo:| va:) js:) de:> zu:} fl:( ss:) ls:[
        1. Tach!

          ich hatte es zwar nicht vergessen aber an einer falschen Stelle platziert. Was mich dennoch wundert wie kommt PHP auf so eine Zahl und sagt nicht, dass ich etwas vergessen habe. Mit welchem Wert fängt PHP an zu rechnen wenn man nichts angibt?

          Hättest du es vergessen hätte PHP gemeckert.

          Genauer gesagt, bei Lesezugriffen auf Variablen, in die vorher nicht geschrieben, und damit auch nicht angelegt wurden, nimmt PHP null als initialien Wert. Der wird beim Rechnen mit Integers und Floats zu 0 konvertiert. Außerdem gibt es eine Fehlermeldung vom Typ E_NOTICE, die aber in der Defaultkonfiguration nicht ausgegeben wird. Das error_reporting auf E_ALL setzen hilft (display_errors muss auch auf 1 oder true stehen).

          An "falscher" Stelle initialisierte Variablen kann PHP nicht erkennen, wenn sich beide Code-Stellen im selben Scope befinden. Daran ist ja nichts grundlegend falsch. Damit man solche Nebenwirkungen nicht unbemerkt bekommt, kann man seinen Code in logisch sinnvolle Einheiten unterteilen und diese in jeweils eigenen Funktionen kapseln. Damit existieren innerhalb der Funktion weder Variablen aus dem globalen Scope noch aus dem Scope anderer Funktionen, mit Ausnahme der bekannten superglobalen Variablen. Dann hätte es auch eine Notice-Meldung gegeben. Und die temporär genutzten Variablen haben keinen Einfluss auf andere Stellen, weil sie beim Verlassen der Funktion beseitigt werden.

          Außerdem empfiehlt es sich beim Debuggen nicht nur den Wert aus dem zusammenzurechnenden Array anzuzeigen, sondern auch das Ergebnis aus der Zwischenrechnung. Damit hätte es eher auffallen können, dass bereits frühzeitig ein falscher Wert entsteht und nicht nur ein falsches Gesamtergebnis.

          dedlfix.