Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: NOTICE pętla while
Forum PHP.pl > Forum > Przedszkole
adamantd
Cześć woła mi NOTICE i wskazuje na linijkę w której jest pętla while,
nie mogę rozkminić dlaczego

  1.  
  2. $i=0;
  3. $ok=0;
  4. while(count($accessTab[$i])>0){
  5. if($_SESSION['adm_access']==$accessTab[$i]){
  6. $ok=1;
  7. }
  8. $i++;
  9. }
  10.  


podpowie ktoś?
nospor
Byłoby miło jakbyś uraczył jeszcze nas tym noticem.... ale zapewne chodzi o to, że odwolujesz się do indeksu tablicy, który nie istnieje...

edit:
while(count($accessTab[$i])>0){
Możesz mi napisać, co niby twoim zdaniem robi to cos?
adamantd
  1.  
  2. Notice: Undefined offset: 2 in C:\WebServ\httpd\medic_localhost\CLASS\adminManager.class.php on line 73
  3.  
nospor
Poprostu uzywaj isset zamiast count....
adamantd
Pomogło tylko pytanie czy to będzie działać dokładnie tak samo, ponieważ przed każdym zapętleniem sprawdzam czy tablica jest większa od zera, jeżeli dojdzie do końca to po zliczeniu wartość count wynosiłaby -1.

I pytanie czy: count($tablica[$i]>0), które równa się -1 jest równe isset($tablica[$i]) które się równa false
matiit
Jeszcze tak w ogóle zastanów się nad sensownością tego kodu smile.gif
Powiedz może co chcesz osiągnąć i "razem" napiszemy coś lepszego, ładniejszego.

adamantd
Pierwszy etap sprawdzenia praw dostępu do poszczególnych zakładek, porównanie zdefiniowanych wcześniej praw dostępu do tego co w sesji
nospor
while(isset($accessTab[$i]) && count($accessTab[$i])>0){

ps: przenosze na przedszkole bo zeby nie umiec uzyc isset to lekka przesada jak na php
adamantd
to wstyd mi wink.gif dzięki za podpowiedź
nospor
A Ty zapoznaj się z FOREACH bo do latania po pętlach to służy właśnie to.
adamantd
Używam na zmianę foreach, for i while.

foreach używam najczęściej świeżo po wyciągnięciu danych z bazy jak chcę wszystko powyświetlać. W czym jest while gorsze? Foreach inaczej działa, bez względu na to jak są ponumerowane klucze i czy tablica jest assocjacyjna czy numeryczna jedzie po kolei a while po numerach, tutaj jakoś lepiej było mi zastosować while
nospor
FOREACH służy do latania po tablicach niezaleznie czy one są numerowane pokolei czy nie.

W czym jest lepsze FOREACH od while? Ano przy foreach nie miałbyś tak głupiego błędu.
I poraz kolejny ci piszę: do latania po tablicach używa się właśnie FOREACH - po to zostało stworzone.

Owszem, jak ktoś ma widzimisie to może używać while... tylko by to używać to trzeba umieć i rozumieć co się robi.
adamantd
jak zaczynałem naukę półtorej roku temu php w ebookach ani na videokursach nigdzie nie pisało, że while używa się tylko jak ma się widzimisie wink.gif ale człowiek uczy się całe życie, będę używał zatem częściej foreach, choć czasami mimo wszystko lepiej mi użyć while.
nospor
Nie napisałem że while się uzywa gdy ma się widzimisie, tylko że while się używa do tablic gdy ma się widzimisie - lekka różnica.

WHILE jest bardzo potrzebną konstrukcją, tylko trzeba rozumieć do czego.
adamantd
mógłbyś rzucić jakiś przykład, żebym wiedział na przyszłość kiedy while, kiedy foreach?
nospor
Już ci pisałem....

FOREACH - gdy iterujesz po tablicy - tu naprawdę nie ma żadnej filozofii...

WHILE - gdy masz mieć pętle która będzie sie wykonywać do czasu spełnienia warunku... W szczegolnosci można tu iterować właśnie po tablicy, ale to sztuka dla sztuki, tzw. widzimisie tongue.gif
adamantd
wszystko jasne -dzięki

ja jestem jeszcze chyba na etapie udowadniania sobie, że potrafię zamiast na etapie upraszczania sobie życia smile.gif
matiit
Kiedy czekasz na zdarzenie, które nie jest z tablicy - np. aż wartość jakiejś zmiennej będzie większa od 10:

  1. $x = pobierz_zmienna_x_z_innego_serwera();
  2. while ($x <=10)
  3. {
  4. //czekamy i znowu pobieramy zmiennną
  5. sleep(1000);
  6. $x = pobierz_zmienna_x_z_innego_serwera();
  7. }
  8. // x jest > 10, mozemy cos robic


$x może symbolizować stan drugiego serwera, jeśli jest większe od 10 - serwer np. jest otwarty i dopiero teraz możemy sie z nim połączyć.

Poza tym wyobraź sobie sytuację, że chcemy sprawdzać czy jakaś strona się zmieniła:
  1. $alarm = new Alarm('loud');
  2. $page_html = file_get_contents('http://stackoverflow.com/questions/ask');
  3. sleep(2000);
  4.  
  5. $new_page_html = file_get_contents('http://stackoverflow.com/questions/ask');
  6.  
  7. while($new_page_html == $page_html)
  8. {
  9. //strona się nie zmieniła, czekamy i pobieramy jeszcze raz
  10. sleep(2000);
  11. $new_page_html = file_get_contents('http://stackoverflow.com/questions/ask');
  12. }
  13.  
  14. // strona się zmieniła, możemy na przykład włączyć alarm.
  15. $alarm->turnOn('short');
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.