Autor Zpráva
Ant
Profil *
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
Ant:
if(strpos($data,$find) !== false)
                    $result = true;
                else{
                    return "řetězec neobsahuje znak <b>$find</b>";
                }
          return true;
Ant
Profil *
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;
Tak to pořád vrací false
Borius
Profil
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 *
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;
Nevypisuje mi chybovou hlášku u kontroly délky.
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 *
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;  
        }
edit: oprava řádků 7+12 - to byla asi příčina, proč se nezobrazilo info o špatné délce
Ant
Profil *
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
Ant:
Pardon, špatně zkopírovaný kód. Na ř.9 má být:
if ($find !== null && strpos($data,$find) === false)
Ant
Profil *
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>

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: