dedlfix: Umgang mit String und int

Beitrag lesen

Hi!

for ($i = 0; $i < count($resultlist); $i++)  {

$zeile = $resultlist[$i]+1;
                 echo 'Zeile ' . $zeile . ': ' . $filecontent[$resultlist[$i]] . '<br />';
            }


>   
> Hätte ich statt $zeile $resultlist[$i]+1 eingefügt, wäre die Ausgabe pro Zeile immer 1 gewesen. Die richtige Ausgabe wäre $resultlist[$i] plus 1.  
> Ich versuchte Lösungen wie ((int)$resultlist[$i])++, half aber nichts.  
  
Wenn das ++ hinten steht, wird die Inkrememtierung erst nach der Rückgabe des Wertes vorgenommen. In der Ausgabe landet also $resultlist[$i] und wenn du dir nach der Schleife den Inhalt des Arrays $resultlist ausgeben lässt, siehst du auch, wo die Inkrementierung geblieben ist.  
  

> Seltsamerweise lieferte ++$resultlist[$i] zwar die richtige Zeilennummer, d.h. hier wurde plötzlich ein int erkannt,  
  
Nein, es wird kein int erkannt sondern es findet eine automatische Typumwandlung statt. ++ ist ein arithmetischer Operator, also wird eine Typkonvertierung in Richtung Zahl vorgenommen. Die Ausgabe ist ein String-Kontext, also wird nach der Berechnung das Ergebnis nach String konvertiert.  
  

> jedoch bedeutet das natürlich, dass die Variable postinkrementiert wird, was ich in diesem Fall aber nicht will.  
  
Du meinst, dass sie hinterher inkrementiert ist (was etwas anderes als postinkrementiert ist). Ob das ++ vor oder nach der Variable steht ist für den unmittelbaren Zugriff auf die Variable interessant, insofern als dass der Wert einmal schon inkrementiert ist, und andererseits erst nach dem Zugriff erhöht wird. Irgendwann hinterher ist dann der Wert immer erhöht.  
  

> Wie geht PHP hier vor? Wieso wird einmal ein int, dann wieder ein String erkannt,  
  
[Operatoren-Rangfolge](http://de2.php.net/manual/en/language.operators.precedence.php) ist das Stichwort. + und . haben den gleichen Rang. Das heißt, dass schrittweise von links nach rechts ausgewertet wird. Bei  
  
`echo 'Zeile ' . $resultlist[$i] + 1 . ': ' . $filecontent[$resultlist[$i]] . '<br />';`{:.language-php}  
  
wird 'Zeile ' und $resultlist[$i] stringverknüpft. Anschließend soll eine 1 hinzuaddiert werden, also wird der String 'Zeile ...' in eine Zahl konvertiert, was 0 ergibt. 1 addiert ergibt 1. Dann kommt mit ». ': '« wieder ein String-Kontext, also wird die 1 in einen String konvertiert und mit dem Nachfolgenden verknüpft.  
  

> und wie könnte ich es ohne eine Zusatzvariable lösen?  
  
Indem du die Auswertereihenfolge explizit vorgibst:  
  
`echo 'Zeile ' . ($resultlist[$i] + 1) . ': ' . $filecontent[$resultlist[$i]] . '<br />';`{:.language-php}  
  
  
Lo!