Autor | Zpráva | ||
---|---|---|---|
Monkeys Profil * |
#1 · Zasláno: 6. 11. 2012, 20:54:03
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 |
#2 · Zasláno: 6. 11. 2012, 21:05:30
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 * |
#3 · Zasláno: 6. 11. 2012, 22:33:12
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 * |
#5 · Zasláno: 6. 11. 2012, 23:22:33 · Upravil/a: Monkeys
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 * |
#6 · Zasláno: 7. 11. 2012, 11:07:08
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 * |
#8 · Zasláno: 7. 11. 2012, 14:44:05
panther:
Mas pravdu zalezi na postupe poradia podmienok. Ale preco ? Prazdny string ma vecsiu prioritu ako string ktory sa nerovna ? M. |
||
panther Profil |
#9 · Zasláno: 7. 11. 2012, 14:52:20
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 |
#10 · Zasláno: 7. 11. 2012, 14:59:09
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 * |
#11 · Zasláno: 7. 11. 2012, 16:42:17
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 |
#12 · Zasláno: 7. 11. 2012, 16:52:57
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 * |
#13 · Zasláno: 7. 11. 2012, 20:08:03
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 |
#14 · Zasláno: 7. 11. 2012, 20:54:53
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á. |
||
Časová prodleva: 11 let
|
0