Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Problem z iteracją
radi_boss
post
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 10.12.2008

Ostrzeżenie: (0%)
-----


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 ?
Go to the top of the page
+Quote Post
kefirek
post
Post #2





Grupa: Zarejestrowani
Postów: 781
Pomógł: 256
Dołączył: 29.06.2008

Ostrzeżenie: (0%)
-----


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


Ten post edytował kefirek 10.12.2008, 15:59:55
Go to the top of the page
+Quote Post
bw6
post
Post #3





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 10.12.2008

Ostrzeżenie: (0%)
-----


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 />";
}
Go to the top of the page
+Quote Post
radi_boss
post
Post #4





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 10.12.2008

Ostrzeżenie: (0%)
-----


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 ?
Go to the top of the page
+Quote Post
Skie
post
Post #5





Grupa: Zarejestrowani
Postów: 555
Pomógł: 84
Dołączył: 20.02.2008
Skąd: Małopolska

Ostrzeżenie: (0%)
-----


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.


--------------------
Wieloprocesowość i wielowątkowość w PHP, poznaj Kraken PHP!
Serwer HTTP i WebSocket w PHP | Promise/A+
Strona Domowa | Elradia MMORPG
FireFox: make the web better.
Go to the top of the page
+Quote Post
radi_boss
post
Post #6





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 10.12.2008

Ostrzeżenie: (0%)
-----


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.

Ten post edytował radi_boss 10.12.2008, 16:46:06
Go to the top of the page
+Quote Post
Darti
post
Post #7





Grupa: Zarejestrowani
Postów: 1 076
Pomógł: 62
Dołączył: 6.03.2005
Skąd: Wroc

Ostrzeżenie: (0%)
-----


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 ?


--------------------
The answer is out there, Neo. It's looking for you. And it will find you, if you want it to.
SERVER_SOFTWARE : Apache/2.2.4 (Win32) PHP/5.2.1
MySQL Client API version : 5.0.27
Go to the top of the page
+Quote Post
radi_boss
post
Post #8





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 10.12.2008

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
erix
post
Post #9





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




A nie możesz po prostu?
  1. <?php
  2. print 'Iteration no. ' . ($i+1) . '<br />'
  3. ?>


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
radi_boss
post
Post #10





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 10.12.2008

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 07:19