Autor | Zpráva | ||
---|---|---|---|
Skrofa Profil * |
#1 · Zasláno: 12. 3. 2011, 21:55:29
Potřebuji kód, kde budu opakovaně vyhodnocovat výraz "krok"...
<?php if ($krok=="1") {echo "jedna";} elseif ($krok=="2") {echo "dva";} elseif ($krok=="3") {echo "tři";} elseif ($krok=="4") {echo "čtyři";} ?> ...podmínek v tomto sledu bude třeba několik stovek (a není to o tom, že potřebuji přepsat číslice na slova :). Pokud je proměnná "krok" třeba 1, pak se skript zastaví hned na začátku, ale pokud bude muset projít několik stovek podmínek, bude to asi pomalejší. Myslel jsem, že bych to zrychlil rozdělením na několik úseků dalšími nadřazenými podmínkami. Asi takto: <?php if ($krok>=1 and $krok<=49) { if ($krok=="1") {echo "jedna";} elseif ($krok=="2") {echo "dva";} elseif ($krok=="3") {echo "tři";} elseif ($krok=="4") {echo "čtyři";} } elseif ($krok>=50 and $krok<=99) { if ($krok=="50") {echo "padesát";} elseif ($krok=="51") {echo "padesát jedna";} elseif ($krok=="52") {echo "padesát dva";} elseif ($krok=="53") {echo "padesát třii";} } elseif ($krok>=100 and $krok<=149) { if ($krok=="100") {echo "sto";} elseif ($krok=="101") {echo "sto jedna";} elseif ($krok=="102") {echo "sto dva";} elseif ($krok=="103") {echo "sto třii";} } ?> Takže při hledání výrazu třeba 107 by to prošlo (3+8) 11 podmínek a né 107 podmínek. A teď bych chtěl slyšet váš názor, jestli je to úplná blbost, nebo jestli to má smysl. Případně jak to vyřešit jinak (myslím že příkaz switch to neřeší). Děkuji |
||
Darker Profil |
#2 · Zasláno: 12. 3. 2011, 21:58:55 · Upravil/a: Darker
Co takhle switch?
switch($krok) 0 : {echo "nula";break} 1 : {echo "jedna" //a tak dále... Nicméně je nesmysl dělat tolik podmínek. /*$krok=(int)$krok;*/ Potom si vytvoř pole číslovek: $jednotky=array("jedna","dva","tri" /*...az do devíti..*/,"devět"); $doDvaceti=array("deset","jedenact" /*...az do devatenacti..*/,"devatenact"); $desitky=array("dvacet","tricet" /*...*/,"devadesat"); Z těch pak skládej celé číslovky. Např 93 přepíšeš do slova takto: $slovem=""; $cislo=explode("",$krok); $slovem.=$desitky[$cislo[0]]; $slovem.=$jednotky[$cislo[1]]; Je to jen koncepce, takhle to asi nemůže fungovat, ale princip z toho snad chápeš. |
||
Tori Profil |
#3 · Zasláno: 12. 3. 2011, 22:09:04
Možná je to blbost, ale napadlo mne: Co všechno záleží na tom, která podmínka se vyhodnotí - liší se jen použitá data, anebo může být v každém elseif i zásadně odlišná logika? (=Jestli by to nešlo převést na databázi (nebo 3D pole??) a z ní vytáhnout data podle hodnoty $krok?)
|
||
Darker Profil |
#4 · Zasláno: 12. 3. 2011, 22:11:20
Tori:
„nebo 3D pole“ Stačí dvě úrovně. Řády a slova pro jejich hodnoty. |
||
YoSarin Profil |
#5 · Zasláno: 12. 3. 2011, 22:17:58
Skrofa:
Čeho přesně se tím snažíš dosáhnout? Úplně nejrychlejší by asi bylo přímé adresování - tzn něco jako: <?php $functionMap = array(1 => 'function1', 2 => 'function2'); $functionMap[$krok](); function function1() { echo 'jedna'; } function function2() { echo 'dva'; } ... ?> Ale nevím jestli zrychlení bude mít nějaký praktický význam a to pole možná bude žrát příliš mnoho paměti... EDIT: případně se dá $functionMap vyhodit a volání bude vypadat nějak takto: <?php $function = 'function' . $krok; $function(); ?> |
||
DoubleThink Profil * |
#6 · Zasláno: 12. 3. 2011, 22:56:44
Skrofa:
„pokud bude muset projít několik stovek podmínek, bude to asi pomalejší.“ To je chybný předpoklad. Pokud nebude počet podmínek v řádu milionů, nebude to hrát žádnou roli. |
||
Skrofa Profil * |
#7 · Zasláno: 13. 3. 2011, 10:28:35
Děkuji za názory.
Pokud tedy stovky podmínek nehrajou žádnou roli, nebudu to asi řešit. Ještě jsem to totiž trochu nadhodnotil (nakonec těch podmínek bude asi max. 300). A čeho tím chci dosáhnout? Potřebuji vytvořit "klíč k určování dřevin", takže na každé stránce budou na výběr dvě možnosti a každá bude odkazovat na další úroveň. Asi takto: <?php if (!isset($_GET["krok"])) {$krok="1";} //pokud není nastaven krok else{$krok=$_GET["krok"];} if ($krok=="1") { echo "<a href='". $_SERVER["PHP_SELF"] ."?krok=2'> Listy jehlicovité nebo šupinovité </a><br> <a href='". $_SERVER["PHP_SELF"] ."?krok=3'> Listy lupenité </a>"; } elseif ($krok=="2") { echo "<a href='". $_SERVER["PHP_SELF"] ."?krok=4'> Listy jehlicovité </a><br> <a href='". $_SERVER["PHP_SELF"] ."?krok=5'> Listy šupinovité </a>"; } elseif ($krok=="4") { echo "Smrk ztepilý"; } ?> Je to jen příklad Také tu zazněl názor s databází, to mě nejdříve vůbec nenapadlo. Myslíte si že by to bylo lepší řešení? |
||
joe Profil |
#8 · Zasláno: 13. 3. 2011, 13:46:35 · Upravil/a: joe
Kdybys napsal hned v prvním příspěvku, myslím, že by bylo jasné, že databáze je na to nejlepší, pak to bude práce tak na cca 5 řádků.
A kdyby se ti i do toho nechtělo a přesto bys to dělal takhle, proč ti to nezjednoduššíš a nezkrátíš: $titles = array(); if ($krok=="1") { $titles[] = array(2 => 'Listy jehlicovité nebo šupinovité'); $titles[] = array(3 => 'Listy lupenité'); elseif ($krok=="2") { $titles[] = array(4 => 'Listy jehlicovité'); $titles[] = array(5 => 'Listy šupinovité'); } ..... if(!empty($titles) { foreach($titles as $krok => $title) { echo '<a href="' . $_SERVER["PHP_SELF"] . '?krok=' . $krok . '">' . $title . '</a>'; } } OPRAVENO, nevšiml jsem si, že uvádíš "krok" jiný |
||
Skrofa Profil * |
#9 · Zasláno: 13. 3. 2011, 20:40:43
Jsem začátečník, takže jsem netušil, že ten zápis jde nějak zkrátit. Možná že to ale nakonec zkusím přes tu databázi. Sice mě to taky chvíli zabere, ale nakonec na to určitě přijdu.
Děkuji všem za rady. |
||
Časová prodleva: 15 let
|
0