Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] If i-ty element tablicy
Forum PHP.pl > Forum > Przedszkole
corvus606
  1. for($i=0;$i<count($imie);$i++) {
  2. if ($Array[$i] == "zmienna"){
  3. ...
  4. }
  5. }


Wyświetla się:
Notice: Undefined variable: Array0

Nie potrafię zapisać tego w taki sposób aby sprawdzało czy wartość i-tego elementu tablicy jest równa "zmienna".

Będę wdzięczny za wszelką pomoc :-)
Niktoś
A nie powinno być tak:

Cytat
for($i=0;$i<count($imie);$i++) {

if ($imie[$i] == "zmienna"){

...

}

}

Puki co nie wiadomo jest czy wcześniej zadeklarowałeś tablicę $Array[]-podałeś tylko kawałek skryptu.
corvus606
Tablica jest zadeklarowana, wydaje mi się, że problem polega na tym w jaki sposób zapisuję warunek if, tzn.
  1. if ($Array[$i] == "zmienna")

Dlatego, że jak wskazuje:
Notice: Undefined variable: Array0
to nie jest traktowane jako i-ty element tablicy, tylko jako zmienna Array0, Array1 itd.
Niktoś
A pokaż jak masz zadeklarowaną tablicę?
corvus606
Tablica jest pobierana na podstawie pliku

  1. <?php
  2. $plik = "db.txt";
  3. $dane = file($plik);
  4. for($i=0;$i<count($dane);$i++) {
  5. list($imie[$i], $nazwisko[$i], $daty[$i], $variable[$i]) = explode(" || ", $dane[$i]);
  6. }
  7. for($i=0;$i<count($imie);$i++){
  8. if ($variable[$i] == "zmienna"){
  9. echo "Dziala!";
  10. }
  11. }
  12. ?>


Plik txt ma postać:
Jan || Nowak || 20.11.2011 || zmienna
abort
Dam Ci wędkę:
wewnątrz pętli for wstaw kod:
  1. print "***$variable[$i]***";

Mam nadzieję, że zauważysz smile.gif
corvus606
Zauważyłem :-) Faktycznie jest to punkt, ale niestety nie rozwiązuje mojego problemu sad.gif
Roboczo zmieniłem tylko warunek na:

  1. if ($variable[$i] == "zmienna ")


(co zrobić z tą nieszczęsną spacją pomyślę później ;-)

Natomiast obawiam się, że to nie tutaj leży problem, ponieważ nic to nie dało... wydaje mi się, że nadal serwer próbuje wczytać zmienną variable0, szczególnie, że kiedy zdefiniowałem przed całym kodem:
  1. $variable0="zmienna ";


działa jak złoto (oczywiście dla $i=0) sad.gif

A dla reszty nadal mam:
Notice: Undefined variable: variable1
itd.
abort
Serwer nie wczytuje ZMIENNYCH. Serwer wczytuje tekst. ten tekst DO ZMIENNYCH przypisujesz Ty.

I kilka rad:
1. Co zrobisz, jak będziesz miał tysiąc linii do przejrzenia? Będziesz tysiąc zmiennych tworzył?
2. Czy widzisz różnicę pomiędzy $variable[0] i $variable0 questionmark.gif?
corvus606
Cytat
Serwer nie wczytuje ZMIENNYCH. Serwer wczytuje tekst. ten tekst DO ZMIENNYCH przypisujesz Ty.

Lapsus językowy :-)

Cytat
1. Co zrobisz, jak będziesz miał tysiąc linii do przejrzenia? Będziesz tysiąc zmiennych tworzył?


Właśnie o to chodzi, że nie, ten fragment:
  1. $variable0="zmienna ";

dopisałem tylko po to, aby upewnić się czy mam rację co do miejsca w którym pojawia się błąd.

Cytat
2. Czy widzisz różnicę pomiędzy $variable[0] i $variable0 questionmark.gif?

Widzę i na tym polega problem (albo nie widzę i gadam głupoty, co również jest możliwe).

I w ten sposób wracamy do tego, że moim zasadniczy problemem jest to że po wpisaniu:
  1. if ($variable[$i] == "zmienna ")

serwer myśli, że chodzi o zmienną o nazwie variable0, variable1 itd., a chcę, żeby chodziło o i-ty element tabeli.

Możliwe, że gadam od rzeczy, późno się robi :-)
abort
Kurna, dopiero teraz zauważyłem:
1. Dlaczego drugą pętlę masz for($i=0;$i<count($imie);$i++) ? Taka konstrukcja (wraz z $imie[$i]) to chyba nie to, czego potrzebujesz?
2. jak chcesz sprawdzać występowanie ciągu znaków w innym ciągu, zainteresuj się np. instrukcjami strpos, strstr, stristr i podobnymi.
corvus606
1. to, dlatego, że chcę, żeby sprawdziło wszystkie elementy $imie
2. dokładnie to potrzebuję, żeby wyświetliło mi tylko te $mie dla których $variable[$i]=="zmienna " i nie bardzo wiem jaką funkcję mógłbym zastosować (strpos, strstr sprawdziłem i nie bardzo mi pasują, ponieważ nie mam wcale pewności czy wszystkie wystąpienia będą po sobie)
3. można to w sumie sprowadzić do problemu znalezienia w pliku postaci:
Jan || Nowak || 20.11.2011 || mezczyzna
Jan || Nowak || 20.11.2011 || mezczyzna
Janina || Nowak || 20.11.2011 || kobieta
Jan || Nowak || 20.11.2011 || mezczyzna
Janina || Nowak || 20.11.2011 || kobieta
obu kobiet. Możliwe, nawet bardzo, że zabieram się do tego od zupełnie złej strony :-)

Aczkolwiek nawet jeżeli tak jest to nadal intryguje mnie czemu to rozwiązanie które proponuje rozbija się o tą linijkę:
  1. if ($variable[$i] == "zmienna ")
abort
Odpowiedź na intrygujące Cię pytanie jest w zawartości zmiennych. Te zmienne NIE SĄ identyczne. Już o tym pisałem (fragment kodu z gwiazdkami) - W tym konkretnym przypadku do jednego z porównywanych ciągów znaków został doklejony znak końca linii (na skutek czytania z pliku).

Poniżej masz dwa wyszukiwania. Jedno ze sprawdzeniem, czy jeden ciąg zawiera się w drugim (za pomocą strpos), i drugi z dokładnym porównywaniem (takim jak Ty robiłeś), ale z rtrim.

A jako zadanie domowe poczytaj sobie o funkcji rtrim i operatorze "!==".

  1. <?php
  2. print "<pre>";
  3. $plik = "db.txt";
  4. $dane = file($plik);
  5. for($i=0;$i<count($dane);$i++) {
  6. list($imie[$i], $nazwisko[$i], $daty[$i], $plec[$i]) = explode(" || ", $dane[$i]);
  7. }
  8. print "\nKobiety:\n";
  9. $szukam = "kobieta";
  10. for($i=0;$i<count($dane);$i++){
  11. if (strpos ($plec[$i], $szukam) !== false){
  12. echo "Znalazlem! (debug: linia=$i, $imie[$i] $nazwisko[$i])\n";
  13. }
  14. }
  15.  
  16. print "\nMezczyzni:\n";
  17. $szukam = "mezczyzna";
  18. for($i=0;$i<count($dane);$i++){
  19. $plec[$i] = rtrim ($plec[$i]);
  20. if ($plec[$i] == $szukam) {
  21. echo "Znalazlem! (debug: linia=$i, $imie[$i] $nazwisko[$i])\n";
  22. }
  23. }
  24. ?>
Niktoś
Spróbuj tak:
  1. $plik = "db.txt";
  2. $dane = file($plik);
  3.  
  4. foreach($dane as $record ) {
  5.  
  6.  
  7. list($imie, $nazwisko, $daty, $variable) = explode("||",ereg_replace( ' +', '',$record));
  8.  
  9.  
  10.  
  11. if ((strlen($imie)>0)&&($variable=="zmienna")){
  12.  
  13. echo $imie. $nazwisko. $variable;
  14.  
  15.  
  16. }
  17. }

Nie wiem czy na nowszych wersjach PHP zadziała, ja ten kod testowałem na http://www.coderun.com - przy okazji fajny serwis do testowania kodów online.
corvus606
Dziękuję, rtrim działa idealnie!
Niktoś
A co jeśli będziesz miał spacje na początku wyrazu?Przykład z ereg_replace usuwa ci wszystkie spacje w danym wierszu.Można użyć , nowszego preg replace.
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.