Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wykluczenie poszczególnych elementów z pętli
Forum PHP.pl > Forum > Przedszkole
jacusek
Witam.
Mam skrypt który generuje listę wyboru dat z godzinami - jest to rodzaj systemu rezerwacyjnego dla przychodni lekarskich.
Skrypt wygląda następująco:
  1. <?php
  2. include('connect2.php');
  3. $sql= "select concat(dni_tyg,godz_pocz) as poczatek, czas_BAD*60 as czas_BAD, concat(dni_tyg,godz_kon)
  4. as koniec from bad_lek where id_lek=3";
  5. $rez= mysqli_query($mysqli, $sql);
  6. while ($nowaTab=mysqli_fetch_array($rez,MYSQLI_ASSOC))
  7. {
  8. $pocz=$nowaTab['poczatek'];
  9. $czas=$nowaTab['czas_BAD'];
  10. $konc=$nowaTab['koniec'];
  11. $poczatek= date('Y-m-d G:i:s', strtotime($pocz));
  12. $koniec= date('Y-m-d G:i:s', strtotime($konc));
  13. }
  14. $sql2= "select timestamp(termin) as zajety from wizyta where id_lek=3";
  15. $rez2= mysqli_query($mysqli, $sql2);
  16. while ($nowaTab1=mysqli_fetch_array($rez2,MYSQLI_ASSOC))
  17. {
  18. $zaj=$nowaTab1['zajety'];
  19. $zajety= date('Y-m-d G:i:s', strtotime($zaj));
  20. }
  21. echo '<select name="termin">';
  22. echo '<option value=>--wybierz datę--</option>';
  23. $termin=$poczatek;
  24. while ($termin<=$koniec){
  25. echo '<option value="'.$termin.'">'.$termin.'</option>';
  26. echo $termin. "<br>";
  27. $termin=date("Y-m-d G:i:s", strtotime("+$czas second", strtotime($termin)));
  28. if ($termin==$zajety){continue;}
  29. }
  30. echo '</select>';
  31. ?>


Próbowałem już różnych rzeczy i chciałem żeby skrypt przy wykonywaniu pętli wykluczał wszystkie opcje które będą podawane przez zmienną $zajety. Są to dokładnie takie same ciągi.
Chciałem to zrobić pętlą for, ale z jakiegoś powodu nie działa mi na datach. Wpadłem na to while, ale nie bardzo wiem jak sprawę rozwiązać dalej. Prosiłbym o jakieś wskazówki ew. przykłady. Mnie się skończyłu pomysły. A że niestety jestem początkujący to za dużo ich nie mam.
Z góry dzięki za waszą pomoc

Wpadłem jeszcze na coś takiego:
  1. for ($termin=$poczatek;$termin<=$koniec;){
  2. echo '<option value="'.$termin.'">'.$termin.'</option>';
  3. echo $termin. "<br>";
  4. $termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin)));
  5. if($termin==$zajety){
  6. continue;
  7. }
  8. }
  9. echo '</select>';

ale to też mi pokazuje całą pętlę. bez wyłączenia $zajety. sciana.gif
Pls pomocy bo już zupełnie nie wiem co zrobić a nie daje mi to spokoju.
nospor
Cytat
ale to też mi pokazuje całą pętlę. bez wyłączenia $zajety.

A ja kiedyś najpierw zjadłem jabłko, a dopiero potem sprawdziłem, czy nie jest zatrute...no i się zatrułem....

Tak samo u ciebie: najpierw wyswietlasz a dopiero potem sprawdzasz czy to nalezalo wogole wyswietlic i jestes niesamowicie zdziwiony ze sie wyswietliło blinksmiley.gif
jacusek
No właśnie nie bardzo wiem jak to sprawdzić.
Dlaczego np nie działa taka opcja:
  1. $termin=$poczatek;
  2. while (($termin<=$koniec)&&($termin!=$zajety)){
  3. echo '<option value="'.$termin.'">'.$termin.'</option>';
  4. echo $termin. "<br>";
  5. $termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin)));
  6. if($termin>$zajety)
  7. continue;
  8. }

zatrzymuje mi się na zmiennej $zajety i dalej się nie wznawia.
nospor
Cytat
No właśnie nie bardzo wiem jak to sprawdzić.
o rety. no napisałem ci w czym problem a ty jakbys wogole tego nie przeczytał...
przeciez ty sprawdzasz, sek w tym ze za późno...

  1. //najpierw wyswietlasz
  2. echo $termin. "<br>";
  3. //a dopiero potem sprawdzasz
  4. $termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin)));
  5. if($termin==$zajety)
  6. continue;

No przeciez z logicznego punktu widzenia, ktory nie ma nic do programowania, najpierw musisz sprawdzic, a dopiero potem jakby co wyswietlic
  1. //najpierw sprawdzic
  2. $termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin)));
  3. if($termin==$zajety)
  4. continue;
  5. //potem wyswietlic
  6. echo $termin. "<br>";
jacusek
Dzięki nospor party.gif . Zaszwankowała u mnie logika sad.gif. Jeszcze cały czas dużo nauki przede mną.
Działa to ale nie do końca. Co teraz zrobić, jeżeli terminów jest więcej niż 1 zajęty żeby je wszystkie wyłączał?
To niestety nie funkcjonuje. Wyłącza tylko ten najwyższy.
nospor
no to niech $zajęty bedzie tablicą a poźniej sprawdzasz przy pomocy in_array()
zulik
OT

  1. include('connect2.php');


ja osobiście robię
  1. require('connect2.php');
jacusek
Ok.
Zrobiłem coś takiego
  1. $sql2= "select timestamp(termin) as zajety from wizyta where id_lek=3";
  2. $rez2= mysqli_query($mysqli, $sql2);
  3. while ($nowaTab1=mysqli_fetch_array($rez2,MYSQLI_ASSOC))
  4. {
  5. $zaj=$nowaTab1['zajety'];
  6. $zajety= date('Y-m-d G:i', strtotime($zaj));
  7. array($zajety);
  8. }
  9. echo '<select name="termin">';
  10. echo '<option value=>--wybierz datę--</option>';
  11. $termin=$poczatek;
  12. while ($termin<=$koniec){
  13. $termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin)));
  14. if ($termin==in_array($zajety))
  15. {
  16. continue;
  17. }
  18. echo '<option value="'.$termin.'">'.$termin.'</option>';
  19. echo $termin. "<br>";

I niestety nadal to nie działa. Dodatkowo nie pokazuje pierwszego wiersza z pętli tylko od razu przechodzi do drugiego sad.gif.
Nie wiem czy o to chodziło.
nospor
kurcze.... ale weź zajrzyj do manuala jak należy uzywac in_array() a nie strzelasz jakieś kody z kosmosu... przedzież w manualu masz to opisane, nawet masz podane przykłady.

Jak tak dalej bedziesz podchodził do sprawy to temat zamkne to może wówczas odrobinę się zmotywujesz smile.gif

kolejna sprawa:
nie:
  1. while ($nowaTab1=mysqli_fetch_array($rez2,MYSQLI_ASSOC))
  2. {
  3. $zaj=$nowaTab1['zajety'];
  4. $zajety= date('Y-m-d G:i', strtotime($zaj));
  5. array($zajety);
  6. }

a:
  1. $zajety = array();
  2. while ($nowaTab1=mysqli_fetch_array($rez2,MYSQLI_ASSOC))
  3. {
  4. $zaj=$nowaTab1['zajety'];
  5. $zajety[]= date('Y-m-d G:i', strtotime($zaj));
  6.  
  7. }
jacusek
Wielkie dzięki i gratulacje za cierpliwość wstydnis.gif .
Tylko mam ostatnie pytanko na które nie ma pomysłu jak rozwiązać.
Mianowicie w liście rozwijanej przestała się pokazywać pierwsza data z pytania $sql za to pokazuje się jedna za dużo powyżej $koniec. Jako pierwsza pokazuje się już powiększona o wartość $czas. Co z tym można zrobić?
ta pierwsza wartość też musi być przecież $termin co wynika z konieczności użycia jej jako zmiennej później.
nospor
to pokaz caly kod bo rzeczy o ktorych tu mowisz nie ma w tym kodzie
jacusek
oto cały kod. Był powyżej ale rzeczywiście w kawałkach:
  1. <?php
  2. include('connect2.php');
  3. $sql= "select concat(dni_tyg,godz_pocz) as poczatek, czas_BAD*60 as czas_BAD, concat(dni_tyg,godz_kon)
  4. as koniec from bad_lek where id_lek=3";
  5. $rez= mysqli_query($mysqli, $sql);
  6. while ($nowaTab=mysqli_fetch_array($rez,MYSQLI_ASSOC))
  7. {
  8. $pocz=$nowaTab['poczatek'];
  9. $czas=$nowaTab['czas_BAD'];
  10. $konc=$nowaTab['koniec'];
  11. $poczatek= date('Y-m-d G:i', strtotime($pocz));
  12. $koniec= date('Y-m-d G:i', strtotime($konc));
  13. }
  14. $sql2= "select timestamp(termin) as zajety from wizyta where id_lek=3";
  15. $rez2= mysqli_query($mysqli, $sql2);
  16. $zajety = array();
  17. while ($nowaTab1=mysqli_fetch_array($rez2,MYSQLI_ASSOC))
  18. {
  19. $zaj=$nowaTab1['zajety'];
  20. $zajety[]= date('Y-m-d G:i', strtotime($zaj));
  21. }
  22. echo '<select name="termin">';
  23. echo '<option value=>--wybierz datę--</option>';
  24. $termin=$poczatek;
  25. while ($termin<=$koniec){
  26. $termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin)));
  27. if(in_array($termin,$zajety))
  28. {
  29. continue;
  30. }
  31. echo '<option value="'.$termin.'">'.$termin.'</option>';
  32. //echo $termin. "<br>";
  33. }
  34. echo '</select>';
  35. ?>

generalnie wiersze w tabeli rozwijanej wyglądają następująco
2009-12-14 15:00
nospor
nie pojawia ci sie pierwsza data, bo na dzien dobry w petli zwiekszasz $termin o $czas
pojawia ci sie o jeden termin za duzo, bo dla koncowego warunku ty zwiekszasz znowu $termin o $czas

Stąd te przesunięcia smile.gif
Tym razem zastanow sie bardziej jak to poprawic winksmiley.jpg
jacusek
Szczerze mówiąc nie wiem jak to zrobić. Udało mi się nawet wstawić do wyświtlania pierwszą wartość poprzez Próbowałem użyć break ale nie wiedzieć czemu pokazuje mi przed ostatnią wartość z tablicy. Dodatkowo nie spełnia się dla pierwszej wartości warunek if(in_array).
Nie wiem może źle szukam. Ale siedzę nad tym od wczoraj sciana.gif
  1. echo '<select name="termin">';
  2. echo '<option value=>--wybierz datę--</option>';
  3. $termin=$poczatek;
  4. echo '<option value=>'.$termin.'</option>';
  5. while ($termin<=$koniec){
  6. $termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin)));
  7. if(in_array($termin,$zajety))
  8. {
  9. continue;
  10. }
  11. if ($termin===$koniec){
  12. break;
  13. }
  14. echo '<option value="'.$termin.'">'.$termin.'</option>';
  15. //echo $termin. "<br>";
  16. }
  17. echo '</select>';
  18. ?>
nospor
Mowiac, ze na dzien dobry w petli zwiekszasz termin, mialem na mysli wlasnie to i nic innego. Nie wiem skad ci nagle do glowy wpadl ten break.
Skoro ci mowie, ze zwiekszasz cos na samym poczatku petli a nie powinienes, to znaczy tyle, ze zamiast zwiekszac na poczatku masz to zwiekszac na koncu petli. Nie doszukuj się zadnych ukrytych przekazów bo takowych tu nie ma.
jacusek
Dobra powiem jak ja rozumuję i popraw mnie gdzie popełniam błąd.
deklaruję że pętla ma się kończyć jak osiągnie koniec.
  1. while ($termin<=$koniec){

zaczyna się od $poczatek
  1. $termin=$poczatek;

no właśnie i tutaj następuje sprawdzanie
  1. if(in_array($termin,$zajety))
  2. {
  3. continue;
  4. }

No ale jak ma coś sprawdzać skoro pętla nie ma z czego wykonywać jeżeli to
  1. $termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin))); "<br>";
  2. echo '<option value=>'.$termin.'</option>';

będzie pod koniec.
Z tego co rozumiem, to tak to powinno wyglądać, ale nie działa i nie wiem w czym rzecz.
Ja rozumiem to co mi piszesz, że od razu zwiększam o wartość $czas. Ale po pierwsze dlaczego nie kończy się na $koniec mimo że ma taki warunek w while i jak mogę zadeklarować początek tabeli, tak żeby warunek in_array też się dla niego spełniał.
nospor
Cytat
No ale jak ma coś sprawdzać skoro pętla nie ma z czego wykonywać jeżeli to
[PHP] pobierz, plaintext
$termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin))); "<br>";
echo '<option value=>'.$termin.'</option>';

będzie pod koniec.
No i dlatego to daj pod koniec (tylko zwiekszanie $termin. reszte kodu zostaw), a ten termin sobie formatuj na początku bez zwiekszania go:
$termin=date("Y-m-d G:i", strtotime($termin));
kapisz? Calego kodu ci nie podam bo czas troche wysilic szare komorki winksmiley.jpg
jacusek
Poprawiłem kod tak jak mówiłeś i nadal nie działa. sciana.gif . Tak to teraz wygląda:
  1. $termin=$poczatek;
  2. echo '<select name="termin">';
  3. echo '<option value=>--wybierz datę--</option>';
  4. echo '<option value=>'.$termin.'</option>';
  5. while ($termin<=$koniec){
  6. $termin=date("Y-m-d G:i", strtotime($termin));
  7. $termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin)));
  8. if(in_array($termin,$zajety))
  9. {
  10. continue;
  11. }
  12. echo '<option value=>'.$termin.'</option>';
  13. }
  14. echo '</select>';
  15. ?>

Ale po pierwsze przy rezerwacji pierwszego terminu nie traktuje go jako $zajete - czyli mimo rezerwacji nadal się wyświetla - i druga sprawa nadal zwiększa się $koniec o wartość $czas.
nospor
przeciez to:
$termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin)));
miales dac na koniec petli... Wiesz co to jest koniec petli?
jacusek
w taki przypaku w ogóle mi się nie wykonuje. Już na prawdę kompletnie nie rozumiem na czym to polego sciana.gif sciana.gif sciana.gif sciana.gif sciana.gif
  1. $termin=$poczatek;
  2. echo '<select name="termin">';
  3. echo '<option value=>--wybierz datę--</option>';
  4. echo '<option value=>'.$termin.'</option>';
  5. while ($termin<=$koniec){
  6. $termin=date("Y-m-d G:i", strtotime($termin));
  7. if(in_array($termin,$zajety))
  8. {
  9. continue;
  10. }
  11. $termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin)));
  12. echo '<option value=>'.$termin.'</option>';
  13. }
  14. echo '</select>';
nospor
  1. while ($termin<=$koniec){
  2. $termin=date("Y-m-d G:i", strtotime($termin));
  3. if(!in_array($termin,$zajety))
  4. {
  5. echo '<option value=>'.$termin.'</option>';
  6. }
  7. $termin=date("Y-m-d G:i", strtotime("+$czas second", strtotime($termin)));
  8.  
  9. }

poprzez continue dochodzilo ci do zapetlenia, gdyz nie zwieszkal sie termin
jacusek
Dzięki wielkie. NOSPOR party.gif party.gif party.gif party.gif . Jak widzisz naprawdę kombinowałem. I dziękuję bo mimo wszystko zmuszasz do myślenia.
Mam tylko pytanie po co był ten wykrzynik przy in_array? W manualu go nie znalazłem (wykrzynika)
nospor
To nie wykrzyknik. To operator negacji winksmiley.jpg
W manualu nie znalazles? Hmm....
http://www.php.net/manual/pl/language.operators.logical.php
winksmiley.jpg

if (in_array()) oznacza: jesli jest w tablicy
if (!in_array()) oznacza: jesli nie jest w tablicy
jacusek
W manualu przy in_array przy przykładach nie znalazłem. A że do znak negacji to się domyślałem. Nie wiedziałem że w takim kontekście można to używać, ale jak mówię jeszcze zółtodziób jestem smile.gif.
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.