Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Pętla w pętli
ensei
post
Post #1





Grupa: Zarejestrowani
Postów: 50
Pomógł: 4
Dołączył: 30.04.2008

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


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
tehaha
post
Post #2





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


Cytat
Przepraszam że tak na około zacząłem ale już nie ogarniam
Gdybyś ogarniał to byś tu nie pisał (IMG:style_emoticons/default/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

Ten post edytował tehaha 2.10.2012, 19:26:23
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 26.12.2025 - 21:21