Keresés

Új hozzászólás Aktív témák

  • lezso6

    HÁZIGAZDA

    LOGOUT blog

    válasz Sk8erPeter #12214 üzenetére

    $a = array(1, 2, 3, 4);
    foreach($a as &$i) echo $i *= 2;
    foreach($a as $i) echo $i;

    A két ciklus "kibontva" valahogy így nézne ki:

    /*
    * Első foreach
    * Itt az 1, 2, 3, 4 tömbből a ref. foreach miatt 2, 4, 6, 8 lesz
    */
    &$i = $a[0]; echo $i *= 2;
    &$i = $a[1]; echo $i *= 2;
    &$i = $a[2]; echo $i *= 2;
    &$i = $a[3]; echo $i *= 2;
    /*
    * Itt $i változó a tömbünk utolsó eleme a referencia miatt
    * Tehát ha $i értéke módosul, módosul a tömb utolsó eleme is
    * A második foreach kavarodást okoz, mert megint $i-t használjuk:
    */
    // A tömb utolsó eleme az első elem is lett egyben (!)
    // Azaz a tömb értékei: 2, 4, 6, 2
    $i = $a[0]; echo $i;
    // Itt az utolsó elem a másodikkal osztozik: 2, 4, 6, 4
    $i = $a[1]; echo $i;
    // Harmadikkal: 2, 4, 6, 6
    $i = $a[2]; echo $i;
    // Végül saját magával, de ő a harmadikra mutat, így...
    // ...marad ahogy volt: 2, 4, 6, 6
    $i = $a[3]; echo $i;

    Tanulság:

    Ha referenciás foreach-et használsz, a fura meglepetések és az akár több órás debuggolás elkerülése érdekében MINDEN ESETBEN töröld a referenciát az utolsó elemre a foreach után az unset() függvénnyel, ami az esetünkben $i, tehát:

    // Így már jó lesz
    $a = array(1, 2, 3, 4);
    foreach($a as &$i) echo $i *= 2;
    unset($i);
    foreach($a as $i) echo $i;

Új hozzászólás Aktív témák

Hirdetés