Przejście do następnego wiersza PHP, pętla for

Witam mam taki malutki problem, być może rozwiązanie może okazać się banalne, ale siedzę dziś już cały dzień przy komputerze i być może zmęczenie nie pozwala mi wymyślić sensownego rozwiązania ;) 

 

A więc tak mam sobie bazę danych w, której jest np. 10 rekordów. 

 

Napisałem sobie pentelkę, która pobiera dane z tej bazy danych i wyświetla je. 

 

Tutaj jest fragment kodu - najistotniejszy 

for ($i = 0; $i < mysql_num_rows($gallery); $i++)
              {
               $row = mysql_fetch_array($gallery);
               echo "<td><a href='../photos/".$row['link']."'> <img src='../photos/".$row['link']."' width='200px' height='200px' border='1'/></a><br /><a href='index_pa.php?go=gallery&gallery_name=".$gallery_name."&delete=".$row['id']."'>Usun</a></td>\n";
 
               if ($i>1 && $i % 3 == 0)
                {
                 echo "</tr>\n<tr>\n";
                }
              }

 

Wszystko niby pięknie, ładnie działa, ale problem pojawia się przy tej ostatniej instrukcji if. 

Mianowicie chciałbym aby po wczytaniu 3 rekordów nastąpiło przejście do następnego wiersza. I tak w kółko - wyświetla 3 rekordy, następna linia, kolejne 3 rekordy, następna linia, itd

Dałem taki warunek, że po każdym wczytaniu przez pętlę rekordu do $i dodawane jest 1 ($i++), jeśli zmienna osiąga wartość większą niż 3 i w dodatku przy dzieleniu przez 3 reszta wynosi 0 następuje przejście do następnego wiersza. Dla mnie wydaje się to logiczne. 

Bo zauważmy:

 

Gdy w tabeli znajdują się 3 rekordy zmienna $i przyjmuje wartość 3 ----> 3/3 =1 r=0 przejście do następnego wiersza bo warunek spełniony

Gdy w tabeli znajduje się 6 rekordów zmienna $i przyjmuje wartość 6 —> 6/3 = 2 r=0 przejście do następnego wiersza bo warunek spełniony

Gdy w tabeli znajduje się 9 rekordów zmienna $i przyjmuje wartość 9 —> 9/3 = 3 r=0 przejście do następnego wiersza bo warunek spełniony

Gdy w tabeli znajduje się 10 rekordów zmienna przyjmuje wartość 10 —> 10/3 = 3,(33) r!=0 warunek niespełniony

 

Teoretycznie niby to działa, tylko jest jedno małe ale, dopiero po wyświetleniu 4(nie 3 rekordów!) następuje przejście do następnego wiersza. Gdzie tu jest problem?

Możesz użyć kolejnej zmiennej np. x. Wtedy kod będzie wyglądał tak:

$x = 0;
for ($i = 0; $i < mysql_num_rows($gallery); $i++)
              {
               $row = mysql_fetch_array($gallery);
               echo "<td><a href='../photos/".$row['link']."'> <img src='../photos/".$row['link']."' width='200px' height='200px' border='1'/></a><br /><a href='index_pa.php?go=gallery&gallery_name=".$gallery_name."&delete=".$row['id']."'>Usun</a></td>\n";
               $x++;
               if ($x == 3)
                {
                 echo "</tr>\n<tr>\n";
                 $x = 0;
                }
              }

Wtedy, jeśli x osiągnie 3, wiersz zostanie zakończony, a x zostanie zresetowane. Pętla zadziała do końca wierszy, a jeśli pod koniec x nie osiągnie 3, wiersz nie zostanie zakończony.

A nie prościej byłoby zmienić tylko wiersz

if ($i>1 && $i % 3 == 0)

na nastepujący

if ($i % 3 == 2)

i gotowe?

Działają obydwa rozwiązania. Pierwsze rozumiem całkiem dobrze. Ale drugie? 

Kluczowa jest pierwsza linia pętli

for ($i = 0; $i < mysql_num_rows($gallery); $i++)

Ponieważ “i” zaczyna się od zera, jeśli w tabeli są trzy rekordy to maksymalna wartość i=2. 

Przy 6 rekordach dopiero przy czwartym (liczymy od zera) powtórzeniu i=3, a więc dopiero wtedy twój warunek jest spełniony. 

Nie używaj funkcji mysql_*, przeżuć się na MySQLi (http://php.net/manual/en/book.mysqli.php)!

@bielu00

Ponieważ iterujesz od zera ($i=0), to

piewszy wiersz ma $i=0

drugi wiersz ma $i=1

trzeci wiersz ma $i=2

i dopiero wtedy chcesz dodać przejście do następnego wiersza - a wtedy reszta z dzielenia przez 3 ($i modulo 3, czyli $i % 3) wynosi 2.

 

@malanek

Przeżuć to można gumę do żucia, przerzucić pisze się inaczej - od rzut/rzucać/rzucić się - warto zapamiętać i już nie robić takich rażących błędów.

Jesteś świetny, tak trzymaj. Dziękuję za poprawienie błędu, bardzo dużo zmieni to w moim życiu, od dziś będę zupełnie innym człowiek.