[ m_k @ 25.03.2005. 19:33 ] @
Na stranici imam list meni čiji html code izgleda ovako:
Code:
<select name=mjesec_r class="input" id="mjesec_r">
            <option value=01>Januar</option>
            <option value=02>Februar</option>
            <option value=03>Mart</option>
            <option value=04>April</option>
            <option value=05>Maj</option>
            <option value=06>Juni</option>
            <option value=07>Juli</option>
            <option value=08>Avgust</option>
            <option value=09>Septembar</option>
            <option value=10>Oktobar</option>
            <option value=11>Novembar</option>
            <option value=12>Decembar</option>
          </select>


Kako da napravim da u zavisnosti od id iz baze bude selektovana određena opcija?
npr ako je id 05 da bude selektovan Maj.

[Ovu poruku je menjao Goran Rakić dana 25.03.2005. u 21:47 GMT+1]

[Ovu poruku je menjao Goran Rakić dana 25.03.2005. u 22:53 GMT+1]
[ Br@nkoR @ 25.03.2005. 20:19 ] @
Code:
 <option value=05 selected>Maj</option>

A ti odradi ostalo.
[ m_k @ 25.03.2005. 20:55 ] @
Ne kontate. Kako cu odrediti gdje treba to select. Nece ovijek biti 05. Moze biti 06, 11...
Taj broj ce biti upisan u neku varijablu.
[ Br@nkoR @ 25.03.2005. 21:11 ] @
Znam da neće biti, ja sam ti samo gornjim kodom objasno kako se u html-u to radi, a na tebi je da uradiš logiku.
Evo npr. najprostiji primer:
Code:

if ($id == 1)
  echo '<option value=1 selected>Januar</option>';
else
  echo '<option value=1>Januar</option>';
  
if ($id == 2)
  echo '<option value=2 selected>Februar</option>';
else
  echo '<option value=2>Februar</option>';
...
itd.
...

[ m_k @ 25.03.2005. 21:42 ] @
Nije li to malo komplikovano. Znaci ja treba da napravim 12 takvih petlji.
Evo kako sam ja kontao rijesiti problem ali imam problem sa arrayem.
Code:
# Upisuje mjesece u array
$mjesec = array(01=>"Januar",02=>"Februar",03=>"Mart",04=>"April",05=>"Maj",06=>"Juni",07=>"Juli",08=>"August",09=>"Septembar",10=>"Oktobar", 11=>"Novembar",12=>"Decembar");

# Printa
for ($i=01; $i<=12; $i++)
    {
        
        if ($datum_r[1] == $i)
            {
                echo '<option value='.$i.' selected>'.$mjesec[$i].'</option>';
            }
        else
            {
                echo '<option value='.$i.'>'.$mjesec[$i].'</option>';
            }
    }

Problem nastaje kada je u arrayu 08=>"August",09=>"Septembar".
Ako stavim 8=>"August",9=>"Septembar" fino mi isprinta li onda petlja zeza.
[ Goran Rakić @ 25.03.2005. 21:52 ] @
Dobro, hajde sada kada sam prosetao temu do tamo i nazad da odgovorim na redefinisano pitanje...

Prvo se pravis satro kako nemas nikavih ideja, a onda kada ti neko ukaze kako bi to moglo ti vices kako je to glupo. Nisi mi jasan po tom pitanju.

Drugo, u petlji se koristi ceo broj, dakle nema vodece nule, isto je i za array. Ako ti bas trebaju vodece nule, koje inace ne znam zasto pravis...
Code:

# Upisuje mjesece u array
$mjesec = array("01"=>"Januar", "02"=>"Februar", "03"=>"Mart", "04"=>"April",
"05"=>"Maj", "06"=>"Juni", "07"=>"Juli", "08"=>"August",  "09"=>"Septembar", 
"10"=>"Oktobar", "11"=>"Novembar", "12"=>"Decembar");

# Printa
for ($i=1; $i<=12; $i++) {
        echo '<option value="'.$i.'" ';        
        if ($datum_r[1] == ($i>9 ? strval($i) : "0".strval($i)) ) echo 'selected';
       echo '>'.$mjesec[$i].'</option>';
}


[Ovu poruku je menjao Goran Rakić dana 25.03.2005. u 23:35 GMT+1]
[ Br@nkoR @ 25.03.2005. 21:59 ] @
@m_k Znam da je malo komplikovano, ali iz tvoje poruke se videlo da ne znaš da odradiš logiku pa sam ti ja napisao najprostije rešenje kako bi video, naravno da može i jednostavnije da se napiše, to sam bio i napisao u poruci ali sam je editovao, npr:
Code:

$months =array ( '01'=>'Januar','02'=>'Februar','03'=>'Mart'....);
foreach ($months as $key => $value) {
if ($id == $key)
  echo '<option value='.$key.' selected>'.$value.'</option>';
else
  echo '<option value='.$key.'>'.$value.'</option>';
}
[ m_k @ 26.03.2005. 13:44 ] @
@Goran nisam rekao da je glupo vec sam rekao da je komplikovano.
Rijesio sam problem jer sam sve u araju uvecao za 10 pa vise nije 01 vec je 11 itd.
[ Goran Rakić @ 26.03.2005. 15:58 ] @
nisi morao da uvecavas za 10. Slobodno si mogao zadrzati (1, 2,..., 10, 11, 12) - dakle bez vodecih nula.
[ m_k @ 26.03.2005. 16:55 ] @
Jedno pitanje. Kako da ispred broja dodam nulu ako je on jednocifren?
[ Goran Rakić @ 26.03.2005. 19:05 ] @
Zar je toliko tesko procitati kod koji ti je dat "na izvolte"? Odgovor se nalazi u trecoj liniji od kraja unutar if uslova u kodu koji sam ti poslao.
[ Ilija Studen @ 26.03.2005. 20:25 ] @
Citat:
Kako da ispred broja dodam nulu ako je on jednocifren?


Code:
if( (integer) $broj < 10) {
  $broj = '0' . (integer) $broj;
}


PS: Ako ovaj problem nisi umeo sam da rešiš mislim da ne bi trebalo ni da programiraš...
[ Goran Rakić @ 26.03.2005. 23:27 ] @
Nije problem sto ne ume sam da resi nego sto mu je resenje vec dato, a on ga je lepo izignorisao...

Nego, kada se vec igramo sa tipovima u PHP-u, nije lose imati doslednost. Ovako ce rezultat biti ili tipa string (ako je manji od 10) ili tipa int (ako je veci od 9):
Code:
string(2) "09"
int(10)


E sada cinjenica da ce biti uradjen typecast, tako da je moguce uraditi intval nad ovim gore i onda je rezultat:
Code:
int(9)
int(10)


ili strval kada je rezultat:
Code:
string(2) "09"
string(2) "10"


Za razliku od mog resenja, ovo (integer) pretvara float u ceo broj tako da se ne desava da rezultat bude:
Code:
string(4) "09.42"


Dakle, moj predlog nekog optimalnog resenja jeste:
Code:
$broj = (((integer) $broj>9?'':'0').strval((integer) $broj));


[ bzero @ 28.03.2005. 09:17 ] @
Citat:

Jedno pitanje. Kako da ispred broja dodam nulu ako je on jednocifren?


Koristi sprintf:

Code:

$broj = sprintf("%02d", $broj);

[ Ilija Studen @ 28.03.2005. 11:26 ] @
sprintf je sporiji od spomenutih rešenja. Goranovo je najbolje jer održava type (o tome nisam razmišljao kad sam kucao :) ).
[ bzero @ 28.03.2005. 12:43 ] @
Citat:

sprintf je sporiji od spomenutih rešenja.


Ne znam kako si dosao do ovoga, ali resenje sa sprintf je zanemarljivo brze od ovoga:

Code:

if( (integer) $broj < 10) {
  $broj = '0' . (integer) $broj;
}


a poprilicno brze od:

Code:

$broj = (((integer) $broj>9?'':'0').strval((integer) $broj));


mada je verovatno brzina prilicno nebitna u konkretnom slucaju, meni se svidja resenje sa sprintf jer je najjednostavnije i najkrace. Ako je bas nephodno da rezultat bude integer, moguce je uraditi type casting:

Code:

$broj = (integer) sprintf("%02d", $broj);
[ Ilija Studen @ 28.03.2005. 13:51 ] @
Citat:
Ne znam kako si dosao do ovoga


Neprovereno. Možda zbog moje odbojnosti prema format stringovima i regexpovima tamo gde se mogu izbeći :) Da li neko pouzdano zna šta je brže?

PS: Ako je recimo taj kod u jednoj petlji koja će se ponoviti milion puta razlika u brzini može biti prilično bitna. A ovo je jednostavno primer koji može da se nađe u takvoj petlji bez problema...
[ Goran Rakić @ 28.03.2005. 14:21 ] @
100 000 slucajnih brojeva izmedju 1 i 12 - isti broj za sva tri resenja
Code:

Goran: 1.803
Ilija: 1.672
bzero: 2.149


Kod:
Code:

<?php
function getmicrotime() {
   list($usec, $sec) = explode(" ",microtime());
   return ((float)$usec + (float)$sec);
}

function getnumber() {
   srand((double)microtime()*1000000);
   return rand(1,12);
}


function goran($broj) {
   return (((integer) $broj>9?'':'0').strval((integer) $broj));
}

function ilija($broj) {
   if( (integer) $broj < 10) $broj = '0' . (integer) $broj;
   return $broj;
}

function bzero($broj) {
   return sprintf("%02d", $broj);
}

$goran = 0; $ilija = 0; $bzero = 0;
for($i=0;$i<100000;$i++) {
 $broj = getnumber();
 $s=getmicrotime();goran($broj);$e=getmicrotime();$goran+=$e-$s;
 $s=getmicrotime();ilija($broj);$e=getmicrotime();$ilija+=$e-$s;
 $s=getmicrotime();bzero($broj);$e=getmicrotime();$bzero+=$e-$s;
}
echo 'Goran: '.round($goran,3)."\n"; echo 'Ilija: '.round($ilija,3)."\n"; echo 'bzero: '.round($bzero,3)."\n";
?>


Moj komentar: Kada je broj veci od 9 Ilijino resenje ne radi nista, tako da tu dobija na brzini. Moje resenje jako ruzno izgleda, ali je prednost sto koristi samo operatore, dakle moguce ga je ubaciti u sam poziv funkcije. sprintf, je dobro resenje (razumljivo i kratko), ali ovde ipak preambiciozno, sudeci barem po ovom rezultatu. Rezultat je za PHP 5.0.3 CLI.

Ovih 0.5s na 100 000 brojeva najcesce nije neko opterecenje jer se na Input/Output funkcije i na rad sa bazom potrosi vise vremena. Ali kada je cilj napraviti web aplikaciju koja se odaziva na ispod 1s, ovih 0.5 je vise nego znacajno.





[ bzero @ 28.03.2005. 14:45 ] @
Evo rezultata Goranovog programa kod mene (5 uzastopnih rezultata):

Code:

Goran: 2.517
Ilija: 2.291
bzero: 2.293

Goran: 2.495
Ilija: 2.267
bzero: 2.301

Goran: 2.52
Ilija: 2.267
bzero: 2.292

Goran: 2.511
Ilija: 2.279
bzero: 2.33

Goran: 2.517
Ilija: 2.274
bzero: 2.289


Code:

dragan@blue $ php -v
PHP 4.3.10 (cli) (built: Jan 27 2005 11:52:09)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies
dragan@blue $ uname -prs
FreeBSD 4.9-RELEASE i386


Izgleda da se dobijaju razliciti rezultati na razlicitim verzijama PHP-a.
[ Goran Rakić @ 28.03.2005. 15:06 ] @
Pitanje je koliko raspodela tih 12 brojeva u 100 000 random-a bude pravilna, mozda bi trebalo povecati broj iteracija za dobijanje tacnijeg resenja. Evo ja sam jos nekoliko puta pokretao i kod mene je poredak uvek isti (kao i prvi put), samo razlika varira od 0.1 do 0.6 izmedju tvog i Ilijinog resenja.

Treba uociti da ovaj test radi jedan skok na funkciju vise nego sto bi trebao za moj i tvoj kod (posto se i moje i tvoje resenje moze koristiti direktno bez omotac-funkcije).

Kod mene je:
Code:

jabuka:~ goran$ /usr/local/bin/php -v
PHP 5.0.3 (cli) (built: Jan 20 2005 21:44:04)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v2.0.3, Copyright (c) 1998-2004 Zend Technologies
    with Zend Extension Manager v1.0.6, Copyright (c) 2003-2004, by Zend Technologies
    with Zend Optimizer v2.5.7, Copyright (c) 1998-2004, by Zend Technologies
    with Zend Debugger v3.5.2, Copyright (c) 1999-2004, by Zend Technologies
jabuka:~ goran$ uname -prs
Darwin 7.8.0 powerpc


[Ovu poruku je menjao Goran Rakić dana 28.03.2005. u 16:08 GMT+1]
[ Jbyn4e @ 28.03.2005. 15:08 ] @
Da zavisi od svacega - zavisi....
Rezultati:
direktno (cli):
Citat:

# php -q brzina.php
Goran: 0.905
Ilija: 0.856
bzero: 0.841

Preko apache modula:
Citat:

Goran: 1.022
Ilija: 1.002
bzero: 0.945

Inace je u pitanju:
Citat:

# uname -prs
Linux 2.6.5-7.97-default x86_64
(masina je AMD 64 na 3200+, SLES 9)
#php -v
PHP 4.3.4 (cli) (built: Jul 1 2004 14:26:35)
Copyright (c) 1997-2003 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2003 Zend Technologies
Apache/1.3.29