Sziasztok!
Van egy oldalam, ami következőképp működik:
ha vásárol valaki egy terméket, akkor a $sales változóba számlálódik.
Ehhez szeretnék egy kis "ariságot" összedobni:
A kód így néz ki jelenleg, de nem jó:
if ($sales >= 10) {
kép beszúrás...
} else if ($sales >=100) {
kép beszúrás...
kép beszúrás... (ugyanaz)
} elseif ($sales >=1000) {
kép beszúrás...
kép beszúrás...
kép beszúrás...
kép beszúrás...
} else {
kép beszúrás...
}
Mielőtt tökhülyének néznétek egy virtuális ölelés-számlálóról van szó, amit kiegészítettem egy smileyval. Ezt szeretném ha többször kitenné attól függően, hogy hány számjegyű ölelés zajlott már le.
Vagy rossz a megközelítés?
Előre is köszi a segítséget.
Megoldás: Mivel végülis nem is maga a $sales értéke számít, hanem az, hogy hány számjegyből áll, így megoldottam egy strlen függvény-switch-case kombóval. :)
Hozzászólások
Jaj! Az első feltétel szinte mindig teljesül, így a többi vizsgálatra nem kerül sor. Aztán ha a sales < 10, akkor ugyan teljesül az else ág, de azokban lévő if-ek nem. Tehát a sorrend rossz. A nagyobb számok felől a kisebbek felé haladva jó lenne, vagy ez a sorrend, de a relációs jel fordítva.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
$i=intval(log10($sales));
switch ($i) {
case 0: valami;
break;
case 1: bármi;
break;
case 2: akármi;
break;
default: többi;
}
Aztán aszerint, hogy ez 0, 1, 2 vagy több, csinál valamit.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
Hogy tetszett csinálni hogy ez a bejegyzés 9 perccel korábbi mint az előző?
A másikat szerkesztette.
Puppy linux felhasználó || Puppy a distrowatchon
Mik vannak!
8 év alatt ezt a fícsőrt még nem sikerült felfedeznem.
Köszi!
Tesztelem az időgépem. :P
Amúgy bohocmasni mondta meg a megfejtést. A részletesebb magyarázatot csak azután írtam a végére, miután a logaritmusos megoldást leírtam a másik hozzászólásban.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
És ha igazán csemegézni akarunk, akkor ebben az esetben a break; el is hagyható. :-)
switch ($i) {
case 2: egymosoly();
case 1: egymosoly();
case 0: egymosoly();
Ekkor ha $i értéke 2, akkor a case 2 ágon bemegy egy mosolyt rajzolni, majd break hiányában megrajzolja az 1 és utána a 0 után játó mosolyt is.
vagy csinálsz egy for ciklust a kócerájra, ha már a logaritmussal linearizáltad :-)
Annyi, hogy az eredeti kód alapján nem lineárisan nő a képek száma a logaritmus növekedésével, hanem exponenciálisan, egész pontosan így: 2^([log10($sales)]-1)
morning trolling on
A kérdésből annyi látszik, hogy a száraz futtatást azután sem próbáltad meg, miután szembesültél azzal, hogy a kód nem a kívánt eredményt hozza.
Ha nem szoksz rá, ennél bonyolultabb számítások/ciklusok/elágazások nemkívánatos kimenete átláthatatlan erdőbe fog vinni.
Amit csináltál, az végül is a változó 10-es alapú logaritmusának egészrésze, ahogyan magam is javasoltam. :) Pontosabban a tied 1-gyel nagyobb eredményt ad, de ez lényegtelen, hiszen azt írsz a case-be, amit akarsz.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE