Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Problem z iteracją
Forum PHP.pl > Forum > Przedszkole
radi_boss
Witam,

przede wszystkim, to mój pierwszy post tutaj, więc mam nadzieję, że przyjmiecie mnie ciepło smile.gif

Mam następujący problem : jako, że wcześniej pisałem trochę w C/C++, a kiedyś także w PHP, to stwierdziłem, że przypomnę sobie ten język, bo może mi się przydać. Napisałem sobie zatem poniższy kawałek kodu :

  1. <?php
  2. for ($i = 0; $i < 10; $i++)
  3. {
  4.     print 'Iteration no. ' . $i+1 . '<br />';
  5. }
  6. ?>

Problem w tym, że pętla ta zamiast wyświetlać dziesięć napisów "Iteration no. 1", "Iteration no. 2" itd., wyświetla mi po prostu 10 jedynek, każdą w innej linii. Domyślam się, że chodzi tutaj o precedencję operatorów, ale nie wiem, w czym problem. Szczególnie, że jeśli ujmę w nawiasy wyrażenie $i+1 to wszystko działa jak powinno. Czy mógłby mi ktoś wyjaśnić, w czym problem ?
kefirek
Zobacz tak
  1. <?php
  2. for ($i=1;$i<=10;$i++)
  3. {
  4. print "Iteration no. $i<br />";
  5. }
  6. ?>
bw6
raczej to nie zadziała bo będzie podwójnie zwiększane $i, zrób poprostu:
Kod
for ($i=1; $i<=10; $i++)
{
   echo "Interation nr $i <br />";
}
radi_boss
Dzięki za odpowiedzi, chciałbym jednak dowiedzieć się, dlaczego tak się dzieje. 

W celu znalezienia odpowiedzi szukałem w "Programming PHP" i znalazłem tam przykłady na wykorzystanie operatora ".". m.in. taki : 

  1. <?php
  2.  
  3. echo "1E3 Points of Light" + 1;
  4.  
  5. ?>


Powyższe zwraca liczbę, podobno typu float, o wartości 1001. Piszą tam, że ma to związek z tym, że w stringu po lewej stronie znajduje się "E". Kompletnie nie mam pojęcia, dlaczego tak to działa.

A wracając do mojego przykładu, powiedzmy, że rozumiem, że operator "." przekształci te stringi na 0 (bo . ma większy priorytet niż + ) ale dlaczego PHP nie zwiększa wartości zmiennej $i ?

Wiem, że to może bezsensowne z jednej strony tak rozważać, ale już widzę swoje problemy, gdy będę np. pobierał coś z bazy danych, a tu nagle nic mi się nie będzie wyświetlało i kompletnie nie będę wiedział dlaczego  blinksmiley.gif . Czy zatem wie ktoś, dlaczego tak się dzieje ?
Skie
Bez użycia nawiasów w print'cie, PHP rozumiał to jako jedno wyrażenie, a ponieważ nie miał podanego typu wyrażenia (string, int itp.) to sam automatycznie próbował coś dopasować. Dopasował widocznie do typu INT i potraktował to:

Kod
'Iteration no. ' . $i+1 . '<br />';


Jako liczbę. Gdy zrobisz to w nawiasie, to ($i+1) zostanie potraktowane jako INT, a całość jako STRING i wyświetlać się będzie poprawnie.
radi_boss
OK, dzięki, choć ja sam napisałem powyżej, że wersja z nawiasami działa smile.gif

Szkoda tylko, że w sumie nie mam pojęcia dlaczego tak jest, wkońcu do tego chyba służy operator "." żeby łączyć ze sobą wartości zmiennych i stringi (gdy np. nie chce się używać apostrofów podwójnych) ?

W każdym razie, dzięki za odp. (choć problem nie do końca rozwiązany snitch.gif)

EDIT : Spróbowałem przed chwilą wpisać po prostu
  1. <?php
  2. print "Iteration no. $i+1 <br />";
  3. ?>
to otrzymuję (bo to jest w pętli) wyniki typu "Iteration no. 0+1", "Iteration no. 1+1", itd. Tutaj nie działa nawet, jak wpiszę $i+1 w nawiasach, będzie się to samo wyświetlać, tyle, że z nawiasami. Dlaczego wobec tego teraz PHP nie zwiększa mi wartości $i ? Nie używam już przecież operatora ".", a jedynie samo dodawanie.

EDIT 2 : Oczywiście, $i się zwiększa, ale dodawanie jakby nie działa, to miałem na myśli.
Darti
To jest naturalne działanie dla PHP że nie wykonuje działań w takich przypadkach, bo zastanówmy się co by się działo, gdyby jednak takie rzeczy robił - jak wtedy celowo napisać takie wyrażenie ? np listując miejsca w 1500-set autobusach $+1 (dla kierowcy) dało by w wyniku liczbę zamiast wyrażenia x+1 ?
radi_boss
Przyznam, że trochę nie kumam tego, delikatnie mówiąc smile.gif
Chodzi mi po prostu o to, że logicznym dla mnie byłoby, gdyby PHP najpierw patrzyło na wyrażenie w " ", w którym jeśli znalazła by się zmienna $i+1 to najpierw by zwiększyło wartość zmiennej, a dopiero później wyświetliło. Bynajmniej, podobnie dzieje się w C++, choć oczywiście tam wyświetla się (mówię o konsoli) zupełnie inaczej. Fakt faktem, że gdy użyję funkcji printf() to wszystko działa tak, jak bym się tego spodziewał (tj. tak jak printf() w C). Szkoda tylko, że jednak nie czaję, dlaczego PHP w tym drugim przypadku wyświetla wartość poprawnie, a przy użyciu samego printa nie smile.gif
erix
A nie możesz po prostu?
  1. <?php
  2. print 'Iteration no. ' . ($i+1) . '<br />'
  3. ?>
radi_boss
Mogę, oczywiście, chodziło mi tylko o niuans, bo pomyślałem sobie, że pewnie kiedyś będę robił coś podobnego i też spotkam się z takim problemem i nie będę wiedział ocb smile.gif

OK, dzięki za wszystkie odpowiedzi.
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.