Hans: for und foreach

Guten (Frei)Tag wünsch ich :-)

Gibt es einen Unterschied zwischen

    for ($i = 0; $i < count($typname); $i++) {  
       echo $typname[$i];  
    }

und

    foreach ($typname as $value) {  
       echo $value;  
    }

?

Hansi

  1. Gibt es einen Unterschied zwischen

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

    echo $typname[$i];
        }

    
    >   
    > und  
    >   
    > ~~~php
    
        foreach ($typname as $value) {  
    
    >        echo $value;  
    >     }
    
    

    ?

    http://de.php.net/manual/de/control-structures.foreach.php:

    Hinweis: When foreach first starts executing, the internal array pointer is automatically reset to the first element of the array. This means that you do not need to call reset() before a foreach loop.

    Hinweis: Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself. foreach has some side effects on the array pointer. Don't rely on the array pointer during or after the foreach without resetting it.

  2. Hallo,

    Guten (Frei)Tag wünsch ich :-)

    Gibt es einen Unterschied zwischen

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

    echo $typname[$i];
        }

    
    >   
    > und  
    >   
    > ~~~php
    
        foreach ($typname as $value) {  
    
    >        echo $value;  
    >     }
    
    

    vielleicht, dass man foreach auf alle iterierbaren Objekte anwenden kann, selbst wenn sie nicht auf count() reagieren (zB. SimpleXML-Objekte)?

    Ansonsten historisch? Erst kam for, dann foreach?

    Gruß

    jobo

  3. Moin!

    Gibt es einen Unterschied zwischen

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

    echo $typname[$i];
        }

    
    >   
    > und  
    >   
    > ~~~php
    
        foreach ($typname as $value) {  
    
    >        echo $value;  
    >     }
    
    

    ?

    Ja.

    foreach bearbeitet alle Elemente des Arrays, in $value erhälst du eine Kopie des Arraywertes.

    Die for-Schleife bearbeitet alle Arrayelemente mit Index von 0 bis count($typname)-1, unabhängig davon, ob diese Elemente tatsächlich existieren.

    Nimm mal folgendes Szenario:

    <?php  
      
    error_reporting(E_ALL | E_STRICT);  
      
    $typname = array(0=>'Index Null', 3=>'Index drei');  
      
    echo "For\n";  
    for ($i = 0; $i < count($typname); $i++) {  
      echo $typname[$i]."\n";  
    }  
      
    echo "Foreach\n";  
    foreach ($typname as $value) {  
      echo $value."\n";  
    }  
    
    

    Ergebnis:

    For  
    Index Null  
      
    Notice: Undefined offset:  1 in /root/test.php on line 9  
      
    Foreach  
    Index Null  
    Index drei  
    
    

    - Sven Rautenberg

  4. Hello,

    Gibt es einen Unterschied zwischen

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

    echo $typname[$i];
        }

    
    >   
    > und  
    >   
    > ~~~php
    
        foreach ($typname as $value) {  
    
    >        echo $value;  
    >     }
    
    

    ?

    Klar gibt es den, insbesondere bei assoziativen Arrays.
    Leider machst Du keine Aussage zum Aufbau deines (vermuteten) Arrays $typname.

    Wenn $typname ein indiziertes Array sit, also eins, dessen Index lückenlos numerisch von 0 .. x läuft, dann kannst Du dieses Array mit der for()-Schleife durchlaufen. Hat der Index aber eine Lücke, gibt es Schwierigkeiten mit den Lücken und der obereb Grenze, die Du mit count() ermittelst. Dia Anzahl der Elemente hat dann ja nichts mehr mit den Indexgrenzen zu tun.

    foreach() arbeitet anders. Du kannst Dir das Array in PHP als verkettete Liste vorstellen, bei verzeweigten Arrays dann eben als Baumstruktur. Foreach() arbeitet nun immer den übergebenen Ast ab, hangelt sich also von einem Element in der Kette zu seinem Nachfolger. Das muss dann keinesfalls der Nachfolger im Index sein, denn der Index bleibt bei foreach() für die Reihenfolge der Abarbeitung ganz außen vor.

    Wenn Du den Index in der foreach()-Schleife benötigst, ermöglicht Dir das Sprachkonstrukt dies durch

    foreach($_arr as $index => $value)
       {
           echo "$index: $value\r\n";
       }

    Die Bezeichner $index und $value sind hier vollkommen frei wählbar und werden im Sprachkonstrukt durch ihre Position an ihre Funktionen gebunden. Du kannst also auch $hans und $gretel dafür verwenden, Hauptsache, Du weißt nachher noch, welcher Name was versinnbildlichen sollte.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  5. Hi Hans!

    Als Ergänzung zu den anderen hilfreichen Antworten:

    Mit foreach hast du die Möglichkeit, auch die Schlüssel des Arrays auszulesen:

    foreach($array as $key => $value)  
    {  
      echo 'Schlüssel: "'.$key.'", Wert: "'.$value.'"'."\n";  
    }
    

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)