Autor Zpráva
Skrofa
Profil *
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";}
?>
a tak dál

...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";}
}
?>
a tak dál

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
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.
Zaprvé si $krok převeď na integer.
/*$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
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
Tori:
nebo 3D pole
Stačí dvě úrovně. Řády a slova pro jejich hodnoty.
YoSarin
Profil
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 *
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 *
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
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 *
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.

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: