[PHP] zle skonstruowana funkcja?

[PHP] zle skonstruowana funkcja?
0

Witam mam maly problem ;/ jestem co nieco poczatkujacy i zrobilem sobie funkcje ktora sprawdza w kazdym wierszy czy NIE MA okreslonego ciagu znakow (funkcja szukajaca). Wiec:

Kopiuj
function heh(){
$liczba_l=count(file('dane.txt'));
$lin=file('dane.txt');

for ($y = 0; $y < $liczba_l; $y++)
	{

		if(strpos($lin[y], $_POST['s']) === 0)
                {
                        echo 'jest<br>';
				
                }
                else
                {
                        echo 'niema<br>';
				
                }       

	}
}

niestety w pliku ZNAJDUJE sie wartosc ktora szukam ale strona wyswietla w kazdej linii "NIE MA" ;/ cos jest zle z === ? prosze o pomoc ;/bo niewiem gdzie jest blad ;/

mephir
  • Rejestracja:prawie 19 lat
  • Ostatnio:ponad 16 lat
0

=== sprawdza czy jest zachowana toższamość typu i wartości
== porównuje wartości tylko
poza tym w manualu php odnośnie funkcji strpos masz taki o to wpis:

If needle is not found, strpos() will return boolean FALSE.

Z czego wynika że wystarcz zmienić sam warunek:

Kopiuj
if(strpos($lin[$y], $_POST['s'])!==false) //rzeczywiście, egh tak to jest jak cos chce się szybko zrobić
              {
                        echo 'jest<br>';
                                
                }
                else
                {
                        echo 'niema<br>';
                                
                }       

A propos po polsku na czerwonym polu pisze:

Ta funkcja może zwrócić logiczne FALSE, ale także zwykłą wartość rozpoznawaną jako FALSE, na przykład 0 lub "".


"Zdrowy rozsądek to zbiór uprzedzeń nabytych do osiemnastego roku życia." - Albert Einstein
<img src="http://img.mephir.net/fedorauser.png" alt="user image" />
0

niestety nic niepasuje ;/ podana funkcja zwraca jednakowe wartosci dla wszystkich wierszy w pliku ;/ moze podam wszystkie dane jakie mam. Plik (przykladowy na ktorym sprawdzam dzialanie):

Kopiuj
The Italian
Wielkie
Sorry
Sal
Szt
Dla
heh
muminki

kodu uzylem podanego ale sprawdzalem tez w razie czego wszystkie warunki podane w komentarzach manuala takie jak

Kopiuj
(strpos("aaa", "aaa") >= 0)      returns true  expected true
(strpos("aaa", "aaa") == true)   returns false EXPECTED TRUE
(strpos("aaa", "aaa") == false)  returns true  EXPECTED FALSE
(strpos("aaa", "aaa") === true)  returns false EXPECTED TRUE
(strpos("aaa", "aaa") !== false) returns true  expected true
(strpos("aaa", "aaa") === false) returns false expected false
(strpos("aaa", "aaa") !== true)  returns true  EXPECTED FALSE

niestety kazde wywolanie zwraca takie same wartosci w adresie w miejscu post wpisuje muminki ;] niestety niedziala ale jak wpisze:

Kopiuj
if(strpos('muminki', 'muminki'))

funkcja dziala ;/ wlasnie dlatego niewiem czemu to jest zle ;/ cokolwiek nierobie albo jest w KAZDEJ linijce wartosc true albo false ;/ zadnych roznicy ;/ otwieram plik za pomoca
fopen('dane.txt', 'r') ale to chyba NIE MA znaczenia ;/ prosze o pomoc ;/

mephir
  • Rejestracja:prawie 19 lat
  • Ostatnio:ponad 16 lat
0

Bo ty to w ogóle moim zdaniem paskudnie robisz i nie chciałe się w to wtrącać, czemy nie wykorzystasz preg_match ? Ja ostatni raz z strpos korzystałem pod koniec podstawówki jak się c uczyłem.
Ja bym to zrobił tak:

Kopiuj
function heh($nazwa_pliku, $szukane){
   $pl=file($nazwa_pliku);
   foreach($pl as $linia) {
      if(preg_match('#.*('.$szukane.').*#Ui',$linia)){
         echo 'jest';
      } else {
         echo 'nie ma';
      }
   }
}
heh('plik.txt','muminki');

ewentualnie W $szukane pilnowałbym aby nie pojawiła się czyste znaki z regexpów, jak kropka, plus itd... trza by je poprzedzić slashem.


"Zdrowy rozsądek to zbiór uprzedzeń nabytych do osiemnastego roku życia." - Albert Einstein
<img src="http://img.mephir.net/fedorauser.png" alt="user image" />
mysz
  • Rejestracja:ponad 18 lat
  • Ostatnio:prawie 9 lat
  • Postów:79
0
mephir napisał(a)

Bo ty to w ogóle moim zdaniem paskudnie robisz i nie chciałe się w to wtrącać, czemy nie wykorzystasz preg_match ?

Bo najlepiej się do tego celu nadaje?

Ja ostatni raz z strpos korzystałem pod koniec podstawówki jak się c uczyłem.

Kiepsko Ci poszło jak widać :(

Do przedpiścy:
Sprawdzaj czy wartość jest różna od false, czyli: strpos () !== false. Poza tym wewnątrz funkcji nie pobieraj parametru z superglobali ($_POST['s']), tylko przekazuj sobie tą wartość jako parametr funkcji. A, i nie wywołuj dwa razy file () tam w środku, najlepiej wcale tego nie wykorzystuj ;) Ale to już szczegół. Tylko nie daj się namówić na używanie preg_match do tego celu, zostaw armatę na lepszą okazję ;)


mephir
  • Rejestracja:prawie 19 lat
  • Ostatnio:ponad 16 lat
0
mysz napisał(a)

Kiepsko Ci poszło jak widać :(

No tak a programownaiem zawodowo zajmuje sie od paru lat, więc chyba jednak nie poszło tak źle [diabel]

A tak w ogóle cfaniaku to porównywanie ciągów znaków dokonuje się funkcja strcmp lub do tego bardziej by się nadawał strstr(), wracając do tamtych czasów.


"Zdrowy rozsądek to zbiór uprzedzeń nabytych do osiemnastego roku życia." - Albert Einstein
<img src="http://img.mephir.net/fedorauser.png" alt="user image" />
ZI
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 15 lat
0

tak zdecydowanie zgadzam się z @mephir

kilka hashy, kropek i gwiazdek w kodzie zawsze bardziej upiększa kod, sprawia że kod jest taki ładny i znikają wszystkie paskudne FALSE z kodu

a w ogóle genialnie jest jak w $szukane jest coś co trzeba escape-ować przed wyrażeniem regularnym, żeby się nie wykrzaczyło... jak dodam kolejnych 20 linijek wtedy czuję że mój program tętni życiem... przed nadchodzącym zawałem

nasz programista z kilkuletnim doświadczeniem pokazał wszystko co pozwala unikać skomplikowanego kodu i nadchodzących problemów

A cytaty jak ten to czysta propaganda, siana przez wszystkich którzy nie lubią znaków przystankowych i ładnego kodu:

manual PHP napisał(a)

Podpowiedź: Do not use preg_match() if you only want to check if one string is contained in another string. Use strpos() or strstr() instead as they will be faster.

a tak przy okazji pierwszego wystąpienia jakiegoś ciągu w kodzie to szukaj tak:

Kopiuj
<?
preg_match('#(.*?)('.preg_quote($szukane).').*#Ui',$linia, $match);
$pos = strlen($match[0]);
?>

Namawiam do tego bo też strpos ostatni raz używałem w podstawówce, powiedziałem sobie że w takie banały rodem ze średniowiecza to ja się bawić nie będę, wtedy to wziąłem zabawki i poszedłem do gimnazjum

stwierdziłem też że wertowanie między oznaczeniami regexp-ów, a modyfikatorami musi być łatwiejsze niż paskudne strpos, a tym bardziej wskazane POCZĄTKUJĄCYM

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.