Eli kyseisssä tehtävässä mulla on ongelma. Yritin ratkaista sitä oheisella koodilla:
<?php $sana1=$_REQUEST['sana1']; $sana2=$_REQUEST['sana2']; $onko=0; $apu; for($i=0;$i<strlen($sana2);$i++){ if($i==0){ $apu=strstr($sana1,$sana2[0]); if(!isset($apu)){ $onko=0; } else{ $onko=1; } }else{ $apu=strstr($apu,$sana2[$i]); if(!isset($apu)){ $onko=0; }else{ $onko=1; } } } echo $onko;
Olen debuggaillut ja tiedän, että se ei toimi oikein ja se johtuu siitä, että tuohon viimeiseen if-koodin lohkoon ei mennä. Olenko ajatellut tuon strstr-funktion toiminnan jotenkin väärin? Eikö sen pitäisi antaa false- jos tuo sana2-muuttujan merkkijonon tietty kirjain ei sisälly tuohon apu-muuttujan sanaan?
Funktio isset palauttaa falsen vain, jos sen argumenttina olevaa muuttujaa ei ole asetettu tai sen arvo on null. Edellisellä rivillä asetat $apulle arvon, joka ei koskaan ole null.
No tulosta $apu-muuttujan arvo ja katso mitä siellä on. Ei se ole sen vaikeampaa. Miksi et itse debuggaa omaa koodiasi?
P.S. isset(false) === true.
LCHawk kirjoitti:
Olen debuggaillut ja tiedän, että se ei toimi oikein ja se johtuu siitä, että tuohon viimeiseen if-koodin lohkoon ei mennä. Olenko ajatellut tuon strstr-funktion toiminnan jotenkin väärin? Eikö sen pitäisi antaa false- jos tuo sana2-muuttujan merkkijonon tietty kirjain ei sisälly tuohon apu-muuttujan sanaan?
Olet ehkä ymmärtänyt tehtävän hiukan pieleen. Tehtävässä pitää siis selvittää voidaanko ensimmäisestä sanasta muodostaa toinen sana vain poistamalla kirjaimia jälkimmäisestä sanasta. sana2 ei siis välttämättä ole sana1:n osajoukko.
PHP-haaste t27 kirjoitti:
$_REQUEST['sana1'] = "SUORAKULMIO";
$_REQUEST['sana2'] = "SALI";
Tuossahan sana SALI ei ole sanan SUORAKOLMIO osa suoraan, vaan välistä tulee sanasta tulee poistaa kirjaimia.
Teuro, koodin idea on kylläkin tuolta osin aivan oikea. Ainoat varsinaiset bugit ovat tuo isset ja se, että $apu-muuttujasta ei poisteta jo löytynyttä kirjainta ja esimerkiksi sanat ABC ja BBBBB menevät siksi läpi. Muutenkin koodissa on kyllä parantamisen varaa: se on pitkä ja siinä on turhaa toistoa.
The Alchemist:
Tulostelin sitä arvoa ja huomasin, että siellä on sisältöä. Ymmärsin tuon strstr-funktion käytön siten, että sillä voi tsekata sen, että se antaa falsen, jos merkkijonoa ei löydy. Huomasin itse, että näin ei ole. Olenko siis ymmärtänyt sen aivan täysin päin seiniä?
Olet ymmärtänyt jotain väärin, ja ilmeisesti et myöskään ole onnistunut testaamaan kovin hyvin. Kokeilepa vaikka näin:
<?php var_dump(strstr("ABC", "A")); var_dump(strstr("ABC", "B")); var_dump(strstr("ABC", "C")); var_dump(strstr("ABC", "D")); $x = strstr("ABC", "D"); var_dump($x, isset($x));
Kuten sinulle jo selvästi sanottiin, isset ei sovi falsen tarkistamiseen. Jos haluat selvittää, onko muuttujassa false, käytä vertailuoperaattoria (===).
Toistan jo kerrottua asiaa mutta vähän eri sanoin..
isset antaa sinulle tietenkin tuossa tapauksessa vastaukseksi true. Pidemmin sanoin se kertoisi:
"yes, $apu is set (to value false)"
Kiitos näistä, nyt alan ymmärtää eli olen siis tajunnut issetin toiminnallisuuden väärin eli issetillä voikin tarkastaa esim. sitä, löytyykö jostain lukuja sisältävästä taulukosta vaikkapa arvoa 5 eikä tuon tyylistä juttuä.
Olen siis ymmärtänyt issetin toiminnallisuuden väärin.
Ei sillä ihan tuotakaan voi tarkistaa siihen soveltunee paremmin in_array() funktio. Alla on pieni esimerkki issetistä. Sillä voit tarkistaa onko jotakin muuttujaa olemassa.
<?php $a = Array(5, 6, 3, 7); $maolenesitelty; $mullaonarvo = 7; echo (isset($a[5]) === true) ? "joo" : "ei"; //ei echo (isset($a[1]) === true) ? "joo" : "ei"; //joo echo (isset($eimuaole) === true) ? "joo" : "ei"; //ei echo (isset($maolenesitelty) === true) ? "joo" : "ei"; //ei echo (isset($mullaonarvo ) === true) ? "joo" : "ei"; //joo
Turhapa sitä on arvuutella, kun kuvauksen voi lukea docseista.
lainaus:
isset — Determine if a variable is set and is not NULL
Jes! Sain näillä neuvoilla toimimaan. Kiitos kaikille!
Aihe on jo aika vanha, joten et voi enää vastata siihen.