2010
12-25

Co robi puste foreach w PHP

Nie dawno temu walczyłem z pewnym błędem w moim kodzie w PHP. Kod działał poprawnie, ale przestawał kiedy dodawałem puste foreach.
  1. //that work with rest of my code
  2. function fun(){
  3. $table= array();
  4. //...
  5. return $table;
  6. }
  7.  
  8. //that do not work with rest of my code
  9. function fun(){
  10. $table= array();
  11. //...
  12. foreach( $table as $key => $val ){}
  13. return $table;
  14. }
  15.  
Zajeło mi troche czasu zanim zorjętowałem się co zmienia pusty foreach. Było dużo kodu w tym projekcię i był problem z znalezieniem błedu.
Tutaj jest fragment po zobaczeniu którego zrozumiałem czemu to nie działa:
  1.  
  2. //...
  3. $table= fun();
  4. $first= current($table);
  5. //...
  6.  
fun() zazwyczaj zwracało tablice z jednym elementem, nigdy pustom. Więc bez foreach działało. Ale nawet pusty foreach zmienia wyrużniony element tablicy na ten za ostatnim, wiec current($table) zwracało FALSE. Oto poprawna droga do robienia takich żeczy:
  1.  
  2. //...
  3. $table= fun();
  4. $first= reset($table);
  5. //...
  6.  
Ale jako że było tam dużo kodu to postanowiłem poprawić to w inny sposób.
  1. //...
  2.  
  3. function fun(){
  4. $table= array();
  5. //...
  6. foreach( $table as $key => $val ){
  7. //...
  8. }
  9. reset($table);
  10. return $table;
  11. }
  12.  
  13. //...
Teraz current(fun()) zwraca pierwszy element.

2 Komentarze.

  1. Xesenix says:

    Speeking of php bug try this one http://bugs.php.net/bug.php?id=29992
    when you use two foreach loops one after another and first uses references like &$item and second uses $item you can`t guess what will happen to array you are looping trough. Best of all is that php authors don`t agree its a bug.

  2. admin says:

    Yes. That’s funny bug.
    When I want to change element in array in foreach I do it like that:
    foreach( $array as $key => $item ){
    //…
    $array[$key]= $new_value;
    //..
    }

Zostaw odpowiedź

  ( Ctrl+Enter )