Autor Zpráva
Monkeys
Profil *
Ako najlepsie a najpresnejsie porovnat 2 retazce?
Napr: ak do inputu napisem neake slovo macka a chcem ho porovnat s vysledkom z DB tiez so slovom macka tak ako ?
Napadlo ma pouzit strlen(macka) == strlen(row[macka]) ale mozu sa vyskytnut aj ine slova ktore su na 5 pismen.
tiez by som to chcel riesit niecim ako ak sa zhoduje cele slovo tak ho vyfarbit na zeleno ak sa zhoduju prve 3 pismena tak vyfarbit na oranzovo a ak sa nezhoduju na cerveno.

$b=0;
while($row=mysql_fetch_assoc($dotaz)){
if(podmienka zelena){
return '<td style="color:green; text-align:left;">'.$odpoved[$b].'</td>';    
}elseif(podmienka oranzova){
...
}elseif(podmienka cervena){
...
}
$b++;
}//end while

M.
panther
Profil
Monkeys:
ak do inputu napisem neake slovo macka a chcem ho porovnat s vysledkom z DB tiez so slovom macka tak ako
if ($_POST/GET['nazev_pole'] == $udaj_z_DB) {...}

tiez by som to chcel riesit niecim ako ak sa zhoduje cele slovo tak ho vyfarbit na zeleno
totéž, co píši výše.

ak sa zhoduju prve 3 pismena tak vyfarbit na oranzovo
tatáž podmínka doplněná o substr.

a ak sa nezhoduju na cerveno.
else
Monkeys
Profil *
panther:
Tak som skusil nieco taketo ale vzdy mi to vrati len tu cervenu hodnotu (predposlednu) aj ked napisem slovo spravne.

function test_hodnota($hodnota){
$dotaz=mysql_query('SELECT hodnota FROM hodnoty WHERE id_hodnoty=1');

while($row=mysql_fetch_assoc($dotaz)){
if(trim($hodnota) == trim($row['hodnota'])){
return '<td style="color:green; text-align:left; font-weight:bold;">'.ucfirst($hodnota).'</td>';    
}elseif(substr(trim($hodnota),0,3) == substr(trim($row['hodnota']),0,3)){
return '<td style="color:orange; text-align:left;">'.ucfirst($hodnota).'</td>';
}elseif(trim($hodnota) != trim($row['hodnota'])){
return '<td style="color:red; text-align:left; text-transform:uppercase; font-weight:bold;">'.ucfirst($hodnota).'</td>';
}else{
return '<td>-</td>';
}
}//end while
}

do funkcie vkladam hodnoty ako pole test_hodnota($_POST['hodnota'][$a]) je to v cykle while.

M.
panther
Profil
Monkeys:
když si za 4. řádek (pod while) dáš echo $hodnota . ': ' . $row['hodnota'], co se stane? Rovnají se ty hodnoty někdy? Tipnu si, že v proměnné $hodnota nic není, nebo v ní je něco, co tam být nemá.

Do else větve tohle nikdy spadnout nemůže, ta je tam zbytečná.
Monkeys
Profil *
panther:

tipol si spravne z DB sa vypisuje stale len prva polozka a porovnava sa s input textom a preto vracia cerveny vystup. Ten while vracia stale len prvy riadok databaze, ak vyhodim vsetky ifi po posledny a spustim to este raz tak to vypise vsetko celu DB.

M.


vyriesil som to tak ze som dal do parametrov funkcie aj porovnavaciu hodnotu test_hodnota($_POST['hodnota'][$a], $riadok['hodnota']). Teda vo funkcii som sa zbavil dotazu a cyklusu while.
Teraz to funguje ako ma takze dakujem za postrcenie :).

Este by som chcel vyriesit tu poslednu podmienku ze ak neobsahuje niaku hodnotu jednoducho tam dat pomlcku ako prazdna.

M.
Monkeys
Profil *
Ta posledna vetva by mala byt v takomto zmysle.

....
}elseif(ak je hodnota pola prazdna){
return tento riadok
}

...
Ako zistim v podmienke ci je hodnota prazdna skusal som !array_values ale moc mi to nepomohlo.

M.
panther
Profil
Monkeys:
ci je hodnota prazdna
empty

vyriesil som to tak ze som dal do parametrov funkcie aj porovnavaciu hodnotu test_hodnota($_POST['hodnota'][$a], $riadok['hodnota']).
nevím, jestli to je řešení a nevím, jestli se mi nad tím chce přemýšlet. Jeden řádek to hledalo jen a pouze proto, že jsi tam měl return, který funkci ukončil po prvním cyklu.

Podmínky musí jít po osbě v následujícím pořadí (možností je více, toto je jedna z možných):
if     stringy se rovnají > zelená
elseif rovnají se první 3 písmena > oranžová
elseif string je prázdný
else   stringy se nerovnají > červená
Monkeys
Profil *
panther:
Mas pravdu zalezi na postupe poradia podmienok.
Ale preco ? Prazdny string ma vecsiu prioritu ako string ktory sa nerovna ?

M.
panther
Profil
Monkeys:
zkus se nad tim poradim podminek trochu zamyslet. To te nenapadlo, ze?

Mas dva retezce, jeden 'aaa' a druhy ''. Pokud das empty() na konec, nikdy se k nemu nedostanes - vzdy skoncis na podmince 'aaa' != '', ktera bude vyhodnocena jako true.
Joker
Profil
Monkeys:
Ale preco ?
Protože když první podmínka je jestli se řetězce rovnají, tak logicky všechny které jí neprojdou se nerovnají, tedy podmínka jestli se řetězce nerovnají zachytí všechny zbývající případy.
Monkeys
Profil *
Joker, panther:

Ano, ked sa nad tym clovek logicky zamysli tak je to tak ako popisujete.
V podstate to teraz cele pekne funguje ale este ma napadla taka vec pocitat jednotlive hodnoty (kolko zelenych, oranzovych a cervenych) a vratit ich ako vysledok.

Ako by ste to riesili ?

M.
panther
Profil
Monkeys:
4, resp. 3 proměnné nastavené na začátku na nulu, postupně se budou v každé z větví inkrementovat (v každé větvi bude jedna proměnná).

Ale zdá se mi, že sem na náš sypeš jeden miniúkol za druhým, aniž by ses nad tím snažil logicky zamyslet. Buď tak laskav.
Monkeys
Profil *
panther:
Moja chyba napisal som problem ale uz som mal nieco napisane v podstate to co si podotkol o tej inkrementacii.
Len neviem ako tu hodnotu teraz dostat z tej funkcie von.

ked mam:
function test_hodnota($hodnota1, $hodnota2 ){
global $spravne;
global $nespravne;

// vetvy
if(podmienka spravne){
return '<td style="color:green; text-align:left; font-weight:bold;">'.ucfirst($hodnota).'</td>';global $spravne;
return $spravne++;
}elseif(podmienka nespravne){
return '<td style="color:red; text-align:left; font-weight:bold;">'.ucfirst($hodnota).'</td>';global $spravne;
return $nespravne++;
}
}

$spravne = 0;
$nespravne = 0;
test_hodnota();

// samotny vypis
<span>Spávnych odpovedí:<tt>'.$spravne.'</tt></span><span>Nesprávnych odpovedí:<tt>'.$nespravne.'</tt></span>

Ta funkcia prijima 2 parametre z ineho cyklu kde sa porovnavaju hodnoty (ako sme riesili vyssie) teraz este chcem vypisat pocty jednotlivych odpovedi, ale asi robim chybu niekde v pouzivani tej funkcie. Podla dokumentacie ak deklarujem neaku premennu vo funkcii na global tak by mala byt pristupna aj mimo funkcie ...

M.
panther
Profil
Monkeys:
zapomeň na global, zapomeň na return.

Pokud chceš něco vypisovat, na to slouží echo, ne return.
Pokud chceš funkcí ne přímo vypisovat, ale vracet (return), musíš si v průběhu funkce vytvořit nějakou proměnnou, text $vysledek a na konci pak bude return $vysledek.

Kdyby sis o returnu něco přečetl, věděl bys, že v momentě, kdy narazíš na první return, je funkce ukončena a dále se její kód nevykonává.

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: