Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Pętla w pętli
ensei
post 2.10.2012, 17:43:28
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
tehaha
post 2.10.2012, 17:44:30
Post #2





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

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


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
Go to the top of the page
+Quote Post
ensei
post 2.10.2012, 18:03:06
Post #3





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

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


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.

Ten post edytował ensei 2.10.2012, 18:03:31
Go to the top of the page
+Quote Post
tehaha
post 2.10.2012, 18:21:14
Post #4





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

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


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.
Go to the top of the page
+Quote Post
ensei
post 2.10.2012, 18:39:47
Post #5





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

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


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
Go to the top of the page
+Quote Post
tehaha
post 2.10.2012, 19:21:45
Post #6





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ł 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
ensei
post 3.10.2012, 01:40:34
Post #7





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

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


Ozłoćcie tego człowieka.

Bardzo Ci dziękuje Dobra Duszo.
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 Wersja Lo-Fi Aktualny czas: 28.04.2024 - 00:09