Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pętla w pętli
Forum PHP.pl > Forum > PHP
ensei
Cześć potrzebuję pomocy.
Mam tabelę w bazie w której trzymane są rezerwacje w godzinach.
Mam również pętle która robi tabelkę w html i wstawia godziny.

  1. for($i=8;$i<=16;$i++)
  2. {
  3. #pobieram zapytanie z bazy, którego wynikiem jest kilka rekordów, więc używam np. foreach
  4. #tak więc pętli się najpierw foreach, a mi chodzi żeby każdy rekord z foreach był użyty dla każdego i.
  5. }


Halo, halo
tehaha
Cytat
tak więc pętli się najpierw foreach, a mi chodzi żeby każdy rekord z foreach był użyty dla każdego i.

no to daj for wewnątrz foreach
ensei
Nie idzie. Wykonuje się [mam 3 rekordy w bazie] najpierw:
dla pierwszego rekordu 8 razy
dla drugiego 8
dla trzeciego 8.

Nie do końca o to mi chodziło. Teraz tak patrzę że właśnie tak napisałem, sory.

Chodzi mi o to że jedna pętla tworzy tabelę html z godzinami a druga pętla z mysql sprawdza czy te godziny z pętli html pokrywają się z godzinami w bazie.
tehaha
mam wrażenie, że to jest jeden z tych przypadków kiedy masz jakiś prosty i standardowy problem, ale wymyśliłeś jakieś dziwne rozwiązanie i nie wiesz jak to zrobić. Nie pisz jak chcesz, żeby to działało tylko jaki ma być efekt końcowy, najlepiej pokaż strukturę tabeli (jeżeli strutkura nie jest oczywista to jakieś przykładowe wpisy) i pokaż jaką tabelkę chcesz z tego uzyskać, bo inaczej to ciężko jest stwierdzić o co Tobie właściwie chodzi.
ensei
Bardzo możliwe że tak jest. Kombinowałem już na różne sposoby, kilka godzin.

Efekt końcowy: W tabeli html ukazują się godziny z informacją czy godzina jest wolna czy zajęta:
np.
8;00 wolna
8;30 wolna
9;00 zajeta
(..)
16;00 zajeta

To czy godzina w danym dniu jest wolna czy zajęta znajduje się w bazie.
W której trzymam:
res_hours w ktorej przechowywana jest godzina(h) rozpoczecia rezerwacji
res_min czy rezerwacja zaczela sie punktualnie czy 30 po.
res_minutes ile minut trwala rezerwacja
To w sumie tyle tego co potrzebne chyba.

Przepraszam że tak na około zacząłem ale już nie ogarniam tongue.gif
tehaha
Cytat
Przepraszam że tak na około zacząłem ale już nie ogarniam
Gdybyś ogarniał to byś tu nie pisał tongue.gif

generalnie inaczej zaprojektowałbym bazę (trzymając w niej godzinę rozpoczęcia i zakończenia terminu), ale tu masz rozwiąnie do Twojej struktury
  1. //rozumiem, że tak wyglądają wyniki zwracane z bazy
  2. $results = array
  3. (
  4. array('res_hours'=>8, 'res_min '=>0, 'res_minutes'=>60), //od 8:00 do 9:00
  5. array('res_hours'=>10, 'res_min '=>30, 'res_minutes'=>90), //10:30 do 12:00
  6. array('res_hours'=>14, 'res_min '=>0, 'res_minutes'=>120), //10:30 do 12:00
  7. );
  8.  
  9. $busyHours = array();
  10.  
  11. foreach($results as $value)
  12. {
  13. for($i=0, $loops = $value['res_minutes']/30; $i<$loops; ++$i) //tworzymy pętlę tyle razy ile zablokowanych terminów mamy w zarezerwowanym czasie np. wizyta 90min na 8:00 blokuje 3 terminy: 8:00, 8:30, 9:00
  14. {
  15. $busyHours[] = date('H:i', strtotime("+".($i*30)." minutes", mktime($value['res_hours'], 0, 0, 0, 0, 0))); //z
  16. }
  17. }
  18. //po tym otrzymujemy tablicę z wszystkimi terminami jakie są zajęte i teraz już łatwo bo w pętli będziemy tylko sprawadzać czy dany termin znajduje się w tablicy
  19.  
  20.  
  21. print_r($busyHours);
  22.  
  23. for($i=8; $i<=16; ++$i)
  24. {
  25. //sprawdzamy czy pełna jest zajęta
  26. $firstTerm = date('H:i', mktime($i, 0, 0, 0, 0, 0));
  27.  
  28. if(in_array($firstTerm, $busyHours))
  29. {
  30. echo "{$firstTerm} zajęty <br>";
  31. }
  32. else
  33. {
  34. echo "{$firstTerm} wolny <br>";
  35. }
  36.  
  37. //sprawdzamy czy wpółdo pełnej jest zajęte
  38. $secondTerm = date('H:i', strtotime("+30 minutes", mktime($i, 0, 0, 0, 0, 0)));
  39.  
  40. if(in_array($secondTerm, $busyHours))
  41. {
  42. echo "{$secondTerm} zajęty <br>";
  43. }
  44. else
  45. {
  46. echo "{$secondTerm} wolny <br>";
  47. }
  48. }


oczywiście to nie taki całkiem gotowiec do wklejenia. Pierwszego foreach zastąp
  1. while($value = mysql_fetch_assoc)
lub
  1. while($value = $query->fetch())
w zależności od tego czy używasz PDO czy funkcje mysql_. Myślę, że z tym już sobie spokojnie poradzisz

Aha zapomniałem dodać jak to generalnie działa, rozbiłem ten proces na 2 etapy:
1. tworzymy tablicę, która będzie zawierać wszystkie zajęte terminy np. 8:30, 9:30, 10:00 itd,
2. przy tworzeniu tabelki html dokonujemy prostego sprawdzenia czy dana godzina znajduje się w tablicy zajętych terminów
ensei
Ozłoćcie tego człowieka.

Bardzo Ci dziękuje Dobra Duszo.
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.