Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Pętla foreach na for
Forum PHP.pl > Forum > Przedszkole
alberthus
Witam

Czy mógłby mi ktoś zamienić pętlę foreach na for? Ona oczywiście poprawnie wyświetla ale chcę ją zamienić na for. Chodzi o wyświetlanie postów już po pobraniu z tabli bazodanowej.

  1. $i = 0;
  2.  
  3. foreach($Rezultat->result() as $Wiersz)
  4. {
  5. $GlownaWpisy['wpisy'][$i]['wpis_id'] = $Wiersz->wpis_id;
  6. $GlownaWpisy['wpisy'][$i]['wpis_tytul'] = $Wiersz->wpis_tytul;
  7. $GlownaWpisy['wpisy'][$i]['wpis_data'] = $Wiersz->wpis_data;
  8. $GlownaWpisy['wpisy'][$i]['wpis_tresc'] = $Wiersz->wpis_tresc;
  9.  
  10. $i++;
  11. }
  12.  
  13.  
com
możesz mi podać choć jeden powód sensowny takiej zamiany? wink.gif
vonski
Np. tak:

  1. for($i = 0, $arr = $Rezultat->result(); current($arr) !== false; $i++) {
  2. $el = current($arr);
  3. $GlownaWpisy['wpisy'][$i]['wpis_id'] = $el->wpis_id;
  4. $GlownaWpisy['wpisy'][$i]['wpis_tytul'] = $el->wpis_tytul;
  5. $GlownaWpisy['wpisy'][$i]['wpis_data'] = $el->wpis_data;
  6. $GlownaWpisy['wpisy'][$i]['wpis_tresc'] = $el->wpis_tresc;
  7.  
  8. next($arr);
  9. }


I na kilka innych sposobów też się da smile.gif
alberthus
Dzięki za odpowiedż.

Tylko nie wiem co robi ta linijka
  1. current($arr) !== false;
czy to jest to samo co
  1. current($arr) == true;
?

Co dokładnie się dzieje w tym miejscu?
com
no wykonujesz pętle dopóki current nie zwróci false trzeba było zajrzeć do dokumentacji smile.gif

tylko dalej nie wiem czemu chcesz zmieniać foreach na to wink.gif
vonski
W tej linijce sprawdzasz czy tablica po której iterujesz ma jeszcze jakieś elementy, czy też jej wewnętrzny wskaźnik wyszedł poza nią. Funkcja current() zwraca element tablicy, na który aktualnie wskazuje wspomniany wskaźnik, lub FALSE jeśli wskaźnik jest poza tablicą.
Jeśli chodzi o Twoje pytanie czy można to zapisać w ten sposób:

  1. current($arr) == true;


to o ile w większości przypadków to się sprawdzi, o tyle jeśli elementem tablicy będzie liczba 0, to wtedy wyrażenie 0 == true ma wartość logiczną FALSE więc pętla zostanie przerwana. I teraz jak to napisałem, to sobie zdałem sprawę, że moje rozwiązanie też nie jest do końca idealne, bo przecież elementem tablicy może być też samo FALSE, więc FALSE !== FALSE ewaluuje do FALSE i pętla się przerywa smile.gif
Dlatego trochę to przerobiłem:

  1. for($i = 0, $arr = $Rezultat->result(), $n = count($arr); $i < $n; $i++) {
  2. list($key, $el) = each($arr);
  3.  
  4. $GlownaWpisy['wpisy'][$i]['wpis_id'] = $el->wpis_id;
  5. $GlownaWpisy['wpisy'][$i]['wpis_tytul'] = $el->wpis_tytul;
  6. $GlownaWpisy['wpisy'][$i]['wpis_data'] = $el->wpis_data;
  7. $GlownaWpisy['wpisy'][$i]['wpis_tresc'] = $el->wpis_tresc;
  8. }


To powinno być ok, sorry za zamieszanie smile.gif
alberthus
Rozumiem, obie wersje działają, jednak próbowałem zrobić to prościej:

  1. for($i=0; $i<count($rezultat); $i++)


tylko nie wiem jak to dalje wyświetlić. Dałoby się tak?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.