Autor Zpráva
Gymplak
Profil
Ahoj,
tak jsem tu zase, snažím si udělat skript na zkoušení slovíček do angličtiny, zápis do souboru i jejich celkový výpis už mám, ale nějak mi teď dělá probém právě zkoušení - porovnání zadaného slovíčka s originálem. Píše mi to, že to zadané slovíčko není dobře (i když je), a nevím v čem je problém, dřívě to fungovalo, ale dělal jsem s tím nějaké úpravy a ... už to nefunguje. Hledím na to už hodně dlouho chvíli, ale nemůžu chybu najít.

Jednotlivé proměnné (anglický výraz orig. ; zadaný výraz) mi přijde z předchozí stránky z formuláře. Problém je v tom,že každé slovíčko můžu mít více synonym, takže ty rozdělím do jednotlilvých polí přes explode(podle čárek mezi výrazy). Když je v poli pouze jedno slovíčko třeba apple a stejné slovíčko zadám do formuláře vypíše to "0" - false. Nechápu. Když mám ale v poli 2 anglická slovíčka "plane,airplane" tak, když zadám to první "plane", vyhodnotí to jako "1" - true, ale když zadám to druhé "airplane" už to vyhodnotí jako "0" false. Nechápu proč to takhle nebere některé výrazy.
$en_word1 - originál slovíčko brané ze souboru
$en_word2 - zadané slovíčko přes formulář


$vyrazy = explode (",",$en_word1);
$pocet = count($vyrazy);

for ($x = 0;$x < $pocet; $x++) {
if ($en_word2 == $vyrazy[$x]){
$pokracuj=1;
echo "1";
}
else {
$NEpokracuj=1;
echo "0";
}
}


Doufám, že mi pomůžete jako vždy.
Díky za každou radu.
Gymplák
Alphard
Profil
if (in_array ($en_word2, explode (",", $en_word1))) echo 1; else echo 0;
Gymplak
Profil
Díky za radu, ale bohužel to problém úplně nevyřešilo, ale už asi vím v čem je problém (nevím jak ho odstranit).
Teď jsem ještě zkoušel ty přenesené proměnné zobrazit, a zjistil jsem že za tím originálním slovíčkem načteném ze souboru je mezera, ať už to do toho souboru zapíšu ručně, či přes skript. Což způsobuje tu nerovnost při porovnání a v tomto případě mi zase funguje pouze slovíčko, které je poslední v souboru, za kterým jsem nezmáčkl enter(když zapisuju ručně). Nevím jakto se tam ta mezera vždycky přidá. Nevíš jak ji na tom konci řádků odstranit ? Přemýšlím jestli nějak uplatnit str_replace, ale protože všechny mezery zrušit nemůžu kvůli dvojslovným výrazům jako např. credit card, nevím jak
Do souboru zapisuju:
 if (fwrite($fp,$czech_word .";".  $english_word."\n"))

Zkoušel jsem i s \n na začátku, ale nepomáhá to, mezera je tam furt.

Gymplák
Alphard
Profil
trim()
Gymplak
Profil
Už mi to přijde skoro blbé, bohužel nepomohl to, funguje pouze poslední slovíčko v souboru. Různě jsem skript upravoval, zkoušel, ale nic, teď ho mám takto:
if(!filesize($slovnik)==0)

(fwrite($fp,"\n
"));
if (fwrite($fp,trim("$czech_word;$english_word"))) {
$words_saved = 1;
}

Když dám trim() i před druhý řádek (fwrite($fp,trim("\n
"))); tak to nový řádek zruší úplně a jednotlivá slovíčka se spojí.

Ještě bych se chtěl zeptat, jestli všehncy ty funkce znáš nebo je nějak hledáš, bo u mě hledání v googlu není vždy úspěšné anebo to najde tolik možností a každou pro jinou příležitost.

Díky za trpělivost Aplhard.
Gymplák
Alphard
Profil
tyhle znám, hledat specifickou funkci je težké, v manuálu hledám především parametry :-)

ale k tvému problému, předpokládám že soubor je nějak takhle
car;auto
train;vlak
bus;autobus
plane;letadlo
konec řádku tady musí být, trim() by se použil až při kontrole

težko hádat, nakopíruj sem několik řádků souboru se slovíčky a celý script na kontrolu včetně načtení dat
WertriK
Profil
Gymplak
Já bych chtěl hlavně doporučit použití databáze, myslim že by jsi ulehčil svým problémům.
Měl by jsi tabulku anglických slovíček, českých a spojovací tabulku.
Vyhledal by jsi v tabulce (anglické, české) slovíčko a pomocí spojovací tabulky by jsi vypsal všechny překlady.

Jinak jak psal Alphard, napiš sem kousek obsahu toho souboru - nejslépe všechny možné typy zápisu - dvojsvloví, více slov ...
Gymplak
Profil
OK, s tou databází to zkusím jako jinou verzi.

EDIT 11:26:Když dám na konec řádku znovu ";", tak už to funguje, slovíčka již se to kontolují dobře (ta mezera se přiřadí do dalšího pole, které nepoužívám) př:
letadlo;jet,plane,airplane,jambo jet;
Sice to problém vyřeší, ale z principu by mě zajímalo v čem by mohla být chyba, kterou stále nemůžu najít.

Pár slovíček ze souboru data.txt:
letadlo;jet,plane,airplane,jambo jet

vhodný,odpovídající,přiměřený;appropriate
přehlédnout,pominout;overlook
jehla,bodec;needle
nemoc,choroba,onemocnění;disease,ill,illness

Zapisuju přes formular zapis.php, který posílá data do zapsat.php, a ten zase přes header se přesměruje na zapis.php s výsledkem uloženým v session, který se pak zobrazí.
Soubor zapsat.php
$english_word = str_replace(' ,',',',$english_word); //pro ostranění mezer před a za čárkami mezi výrazy

$czech_word = str_replace(' ,',',',$czech_word);
$english_word = str_replace(', ',',',$english_word);
$czech_word = str_replace(', ',',',$czech_word);
trim($czech_word); //tohle jsem přidal až na radu Alpharda
trim($$english_word);
...
if(!filesize($slovnik)==0)
(fwrite($fp,"
"));
if (fwrite($fp,trim("$czech_word;$english_word"))) {
$words_saved = 1; }
else {...}

Soubor obsahuje ještě další větvení v podobě podmínek jestli soubour existuje, je-li zapisovatelný a jestli josu zadány správně slovíčka - když to nesplňuje, odkáže se to ne předešlou stránku s chybou.

Zkoušení probíhá přes zkouseni s formularem v souboru zkouseni.php, ten vybere náhodné číslo pole do kterého jsou načtené řádky ze souboru, rozdělí přes ";". Zkoušený musí do formuláře zadat výraz -> přenesení na stránku s oveřením -> přesměrování zpěz, kde s session je opět uložený výsledek operace, který se následně zobrazí.
Souborzkouseni.php:
$slovicka = File ($slovnik); //$slovnik načítám ze konfiguračního souboru = data.txt
$PocetSlovicek = count($slovicka)-1;
$NahodneSlovicko = mt_rand (0,count($slovicka)-1);
$casti = explode(";",$slovicka[$NahodneSlovicko]);
$cz_word = $casti[0];
$en_word = $casti[1];
// část formuláře do kterého se zadává zkoušené slovíčko + přenos spárvného výrazy v skyrtém políčku hidden
<input id="text-disabled" type=text disabled name="cz_zadani" value="<?php echo $cz_word ?>" lenght="15" /></td>
<td><input id="text" type="text" name="en_word2" lenght="15" /></td>
<td><input type="hidden" name="en_word1" value="<?php echo $en_word ?>" /></td>
<td><input type="hidden" name="cz_word1" value="<?php echo $cz_word ?>" /></td>
<td><input type="hidden" name="word_number" value="<?php echo $NahodneSlovicko ?>" /></td>
....

Soubor overeni.php
$vyrazy = explode (",",$en_word1);

$pocet = count($vyrazy);

for ($x = 0;$x < $pocet; $x++) {
if ($en_word2 == $vyrazy[$x]){
$pokracuj=1;
echo "1";
}
else {
$NEpokracuj=1;
... // dál v souboru je ještě přesměrování, uložení odpovědi do session podle toho jestli existuje proměnná $pokracuj nebo ne.
echo "0";
}
}

Doufám, že vás tím kódem příliš nezahltím.
Gymplák
Alphard
Profil
ten cyklus by měl být zbytečný, co se stane, když dáš do overeni.php tohle?

if (in_array (trim ($en_word2), explode (",", trim ($en_word1))))
{ $pokracuj=1;
echo "1"; }
else
{ $NEpokracuj=1;
echo "0"; }
Gymplak
Profil
Díky už to funguje. Ale nechápu proč to u toho cyklu for chybu dělalo a teď ne ?!

Ještě jednou díky, Gymplák

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: