Autor | Zpráva | ||
---|---|---|---|
Ant Profil * |
#1 · Zasláno: 28. 4. 2012, 19:03:51 · Upravil/a: Moderátor (editace znemožněna) 30. 4. 2012, 18:55:10
Ahoj, mám problém s funkcí strpos. Měla by vrace pozici nalezeného znaku, jinak false. No a mě to pořád vrací true
Tady je část kodu z funkce: $result = false; if(strpos($data,$find) == false) $result = true; else{ return "řetězec neobsahuje znak <b>$find</b>"; } return true; Děkuji za pomoc Moderátor Majkl578: Titulek „Nefunguje strpos“ nevystihuje podstatu dotazu. Příště zkus prosím vymyslet lepší.
|
||
Taps Profil |
#2 · Zasláno: 28. 4. 2012, 19:16:42
Ant:
if(strpos($data,$find) !== false) $result = true; else{ return "řetězec neobsahuje znak <b>$find</b>"; } return true; |
||
Ant Profil * |
#3 · Zasláno: 28. 4. 2012, 20:45:38
Pořád to nefunguje, metoda mi stabilně vrací true. Metoda má zkontrolovat, jestli má řetězec požadovanou velikost a jestli obsahuje nějaký znak.
private function Control($data, $size = null, $find = null) { $result = false; if($size != null){ if(strlen($data) == $size) $result = true; else{ $result = false; return $this->message ="Chybná délka"; } } if($find != null){ if(strpos($data,$find) !== false) $result = true; else{ $result = false; return $this->message =" řetězec neobsahuje znak <b>$find</b>"; } } return $result; } Když potom udělám if(Control($data,$size,$find)) return true; else return false; |
||
Borius Profil |
#4 · Zasláno: 28. 4. 2012, 21:29:06
Ant:
„metoda mi stabilně vrací true“ Očekáváš, že Ti vrátí false. Ale ona ti vrátí true – přesněji – vrátí Ti " řetězec neobsahuje znak <b>$find</b>", což vyhodnotí jako true. V tu chvíli ukončuješ funkci příkazem return. A k očekávanému return $result proto ani nedojde. Ta chyba je na řádku 17.
|
||
Ant Profil * |
#5 · Zasláno: 28. 4. 2012, 21:41:37
Ale ono to nefunguje, ani takto:
private function Control($data, $size = null, $find = null) { $result = false; if($size != null){ if(strlen($data) == $size) $result = true; else{ $result = false; $this->message ="Chybná délka"; } } if($find != null){ if(strpos($data,$find) !== false) $result = true; else{ $result = false; $this->message =" řetězec neobsahuje znak <b>$find</b>"; } } return $result; } if($this->ControlString($value,$size,$find)) return true; else return $this->message; |
||
Tori Profil |
Ant:
„Metoda má zkontrolovat, jestli má řetězec požadovanou velikost a jestli obsahuje nějaký znak.“ Ale ve skutečnosti metoda ověřuje, že řetězec má požadovaný počet bajtů anebo že obsahuje zadaný znak. Na ř.12 by bylo lepší porovnávat pomocí !== , jinak nebude možné ověřit, že řetězec obsahuje nulu.
„Nevypisuje mi chybovou hlášku u kontroly délky.“ Můžete, prosím, ukázat, s jakými parametry vám to zlobí? Zkoušela jsem to teď a funguje podle očekávání. Pokud jste zadal toto: Control('asdf', 1, 'a') , tak vám to kvůli chybné logice samozřejmě vrátí true, přestože v proměnné $this->message bude hláška o špatné délce.
|
||
Ant Profil * |
#7 · Zasláno: 28. 4. 2012, 22:30:15
Ale ve skutečnosti metoda ověřuje, že řetězec má požadovaný počet bajtů anebo že obsahuje zadaný znak.
Nejsem si jist, ale myslím, že s tímto nemáte pravdu. Proto tam je proměnná result, která, pokud bude správně velikost i hledaný znak vrátí true, pokud alespon jedno nebude správně, vrátí se false, nebo ne? |
||
Tori Profil |
Ant:
„pokud alespon jedno nebude správně, vrátí se false“ Ne zcela. Pokud chcete ověřovat jen délku nebo jen znak uvnitř řetězce, funguje podle očekávání. Pokud ale ověřujete oboje, vrátí pouze výsledek hledání znaku v řetězci, bez ohledu na výsledek porovnání délky. Upravila bych metodu třeba takhle: private function Control($data, $size = null, $find = null) { $result = true; if ($size !== null && strlen($data) !== $size) // nebo mb_strlen() { $result = false; $this->message .= "Chybná délka"; } if ($find !== null && strpos($data,$find) !== false) { $result = false; $this->message .= " řetězec neobsahuje znak <b>$find</b>"; } return $result; } |
||
Ant Profil * |
#9 · Zasláno: 28. 4. 2012, 23:00:49
Nene pořád to nefunguje.
if($this->Control('qwert',5,'q')) return true; else return $this->message; } Vypíše že je špatná délka if($this->Control('qwe',5,'q')) return true; else return $this->message; } Vypíše obě hlášky |
||
Tori Profil |
#10 · Zasláno: 28. 4. 2012, 23:08:05
Ant:
Pardon, špatně zkopírovaný kód. Na ř.9 má být: if ($find !== null && strpos($data,$find) === false) |
||
Ant Profil * |
#11 · Zasláno: 28. 4. 2012, 23:09:58 · Upravil/a: Ant
No jo, to mě mohlo napadnout. Tak moc děkuju za pomoc
Tak ještě pořád nic, pořád to hlásí chybu s délkou |
||
Tori Profil |
Ant:
„pořád to hlásí chybu s délkou“ Jaké jsou vstupní hodnoty (text a délka)? Pokud řetězec obsahuje znaky s diakritikou, může strlen u některých kódování (např. utf-8) vracet "špatnou" hodnotu - řešením je použít mb_strlen. Anebo nechtěl jste místo "řetězec má přesně x znaků" ověřit, že "řetězec nemá víc, než x znaků"? |
||
Lister Profil |
Rozhodl jsem se napsat jedinou spravnou odpoved, vsechno ostatni je tady TEZCE k smichu... Napsat na to zhuverilou funkci mi prijde fakt excelentni masakr... Btw. to si muze dovolit clovek v c, NIKDY v php.
Ant: Nevim kde jsem to cetl, ale vychazi to ze selskeho rozumu a php manualu (vrele doporucuju pouzit). Strpos se da pouzit leda tak na vyskyt v retezci a to zpusobem strpos($haystack, $needle) !== false => pak je true kdyz najde a false kdyz nenajde. Toto je jedine mozne reseni, jinak z nej leze blabol, protoze 0 = false (php je d*bil a pretypuje to). Pokud neni jasny vysledek stale, tak jedine prijatelne reseni je: $result = strpos($haystack, $needle); return $result !== false ? $result : -1; //vrati bud pozici cislo pozice nebo zaporne cislo pro nenalezeni, protoze jinak 0 a false nejde rozeznat leda testem na typ a to je tez zhuverilost Je to jen pro vysvetleni logiky, jak se se strposem musi pracovat, jinak samozrejme existuje strncmp, ktery ty 2 radky spoji do 1 prikazu :-) |
||
Tori Profil |
<mimo-téma>
Lister: „Strpos se da pouzit leda tak na vyskyt v retezci a to zpusobem ...“ 1. Copak ho tu někdo chtěl použít na něco jiného? 2. Ve všech kódech v tomto vlákně se návratová hodnota strpos ověřuje pomocí !==, s tím problém nebyl. </mimo-téma> |
||
Časová prodleva: 11 let
|
0