Avatar billede techboy992 Praktikant
14. december 2012 - 16:19 Der er 23 kommentarer og
1 løsning

Drop down med dato i en samlet dropdown

Har proevet at sammensaette dette script, men det virker ikke

viser kun dato 31 december 2014.

hvordan kan jeg paa den til at virke korrect saa den viser mindst 1 maaneds datoer i dropdown.

Paa Forhaand tak
Brian Olsen

<?php
$months = array ('January', 'February', 'March', 'April', 'May', 'June','July', 'August', 'September', 'October', 'November', 'December');
$weekday = array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
$days = range (1, 31);
$years = range (2010, 2014);

$currentdate = date('D m Y');


echo "<select name='dato'>";
foreach ($days as $value1)
foreach ($months as $value2)
foreach ($years as $value3)
$value = ($value1 . $value2 . $value3);
{
  $default = ($value == $currentdate)?'selected="selected"':'';
  echo '<option '.$default.' value="'.$value.'">'.$value."</option>\n";
}




echo '</select> &nbsp; ';
?>
Avatar billede olebole Juniormester
14. december 2012 - 17:17 #1
<ole>

Hvor skal listen begynde - og hvor skal den slutte?

/mvh
</bole>
Avatar billede techboy992 Praktikant
14. december 2012 - 23:03 #2
Den skal koerer saa den hele tiden viser mindst en maaned frem fra dags dato
Avatar billede olebole Juniormester
15. december 2012 - 03:58 #3
Hvorfor skriver du "mindst en måned frem" i stedet for det, du ønsker? Du kan vel ikke bruge en, der viser 14 år og 312 dage ud i fremtiden ... eller?  *o)

Anyway, her er en funktion, som skriver en SELECT ud, som rækker frem til samme dag som idag - næste måned:

<?php
function getSelectString() {
    $months = array('', 'januar', 'februar', 'marts', 'april', 'maj', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'december');
   
    $now = time();
    $lastDay = date('d', strtotime('last day of this month', $now));
    $stmpFirstDay = strtotime('first day of next month', $now);
   
    $arrThisDay = explode('.', date('d.m.Y', $now));
    $thisDay = $arrThisDay[0];
    $thisMonth = $months[(int)$arrThisDay[1]];
    $thisYear = $arrThisDay[2];
   
    $arrNext = explode('.', date('m.Y', $stmpFirstDay));
    $nextMonth = $months[(int)$arrNext[0]];
    $nextYear = $arrNext[1];
   
    $arrHtml = array('<select name="dato">');
    for ($i=$thisDay; $i<=$lastDay; $i++) {
        $tmp = ($i<10 ? '0'.$i : $i).'. '.$thisMonth.' '.$thisYear;
        $arrHtml[] = '<option value="'.$tmp.'">'.$tmp.'</option>';
    }
    for ($i=1; $i<=$thisDay; $i++) {
        $tmp = ($i<10 ? '0'.$i : $i).'. '.$nextMonth.' '.$nextYear;
        $arrHtml[] = '<option value="'.$tmp.'">'.$tmp.'</option>';
    }
    $arrHtml[] = '</select>';
   
    return implode('', $arrHtml);
}

echo getSelectString();
?>
Avatar billede olebole Juniormester
15. december 2012 - 04:06 #4
PS: Lad dig ikke forvirre af navnene $thisYear og $nextYear. Der er tale om 'denne måneds årstal' og 'næste måneds årstal'.

Netop nu i midten af december vil de to årstal være forskellige. Om en måned vil de være ens, frem til næste december.

Nu, jeg lige kikkede koden igennem kan jeg godt se, navnene ikke er særligt sigende/pædagogiske  =)
Avatar billede olebole Juniormester
15. december 2012 - 04:11 #5
PPS: Er det overhovedet nødvendigt, den går længere end til 21. december 2012?  :D
Avatar billede techboy992 Praktikant
15. december 2012 - 06:49 #6
tror stadig der er nogen der arbejder maaneden ud
Avatar billede techboy992 Praktikant
15. december 2012 - 11:17 #7
Scriptet virker for december, men hvor den skulle skrive januar skriver den 1. december 1969 i stedet for 1. januar 2013, men det er lige det jeg soeger hvis den kunne komme til at skrive rigtigt for januar
Avatar billede Slettet bruger
15. december 2012 - 14:47 #8
Lidt enklere ?
<html><head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
</head><body>
<form name="formen" action="javascript:alert(document.formen.dato.value)">
<select name="dato" style="font:bold 15px courier">

<?php
$mnd = array('januar','februar','marts','april','maj','juni','juli','august','september','oktober','november','december');
$dag = array('Søndag&nbsp;','Mandag&nbsp;','Tirsdag','Onsdag&nbsp;','Torsdag','Fredag&nbsp;','Lørdag&nbsp;');


$nu = time();                            // idag
$s = "";
for ($i=0;$i<30;$i++)                    // ca 1 måned..
    {
    $s .= "<option value='$nu'>"          // value = PHP's tidsformat
        .$dag[ date("w",$nu)]." "        // "Mandag "
        .date("j",$nu).". "              // "24. " (brug "d" for 01,02..)
        .$mnd[ date("n",$nu)-1 ]." "      // "december "
        .date("Y",$nu)                    // "2012"
        ."</option>";
    $nu += 24*60*60;                      // læg 24 timer til
    }
echo $s;
?>

</select>
<input type="submit" value="OK">
</form></body></html>
Smid det hele i én .php fil.
Åbndn : )
Avatar billede techboy992 Praktikant
15. december 2012 - 15:11 #9
T4NK32 virker fint, men kunne dage tages ud saa kun viser dato
15-12-2012, da jeg strto til at se om der nogen paa vagt.

Paa forhaand tak

Brian Olsen
Avatar billede Slettet bruger
15. december 2012 - 16:00 #10
Det er næsten for let:
$s .= "<option value='$nu'>" . date("d-m-Y",$nu) . "</option>";

"strto" ?!?
Avatar billede techboy992 Praktikant
15. december 2012 - 16:27 #11
strtotime
Avatar billede techboy992 Praktikant
15. december 2012 - 16:28 #12
Skal jeg bare fjerne denne linie  .$dag[ date("w",$nu)]." "        // "Mandag " ??
Avatar billede Slettet bruger
15. december 2012 - 17:11 #13
Erstat hele blokken:

$s .= "<option value='$nu'>"
      .$dag[ date("w",$nu)]." "
      .date("j",$nu).". "
      .$mnd[ date("n",$nu)-1 ]." "
      .date("Y",$nu)
      ."</option>";

med:

$s .= "<option value='$nu'>" . date("d-m-Y",$nu) . "</option>";

Men, ærligt talt, det er da bedre med ugedag og månedsnavn.
- selecten behøver ikke at fylde mere af den grund - før den aktiveres.

style="width:100px" f.eks..
Avatar billede techboy992 Praktikant
15. december 2012 - 17:32 #14
det ser bedre ud,det vil jeg give dig ret i, men det vil ødelægge timestampet i databasen når det bliver lagt derind i.
Avatar billede olebole Juniormester
15. december 2012 - 18:11 #15
"Scriptet virker for december, men hvor den skulle skrive januar skriver den 1. december 1969 i stedet for 1. januar 2013, men det er lige det jeg soeger hvis den kunne komme til at skrive rigtigt for januar"

Det giver da ikke mening i forhold til, hvad du spørger om. Du beder om en SELECT, som skriver en måned ud fra dags dato. Hvad er det, du ønsker?

@T4NK32: Ja, noget i den retning, er jo det allerførste, man kommer til at tænke på. Lige indtil man kommer til at tænke sig om og opdager, at man opretter 4 (fire) nye date objekter for hvert gennemløb af løkken.

Hvor du kan nøjes med 3 opretter din kode 120 - dvs. 117 unødvendige instantieringer af date objektet. Så kan det vist ikke skrives mere ineffektivt  =)
Avatar billede olebole Juniormester
15. december 2012 - 18:46 #16
@techboy992: Nu har jeg læst #7 igen, men det passer ikke, hvad du skriver. Det script, jeg lagde i #3 skriver fint '01. januar 2013'.

Jeg ved ikke, hvad du har gjort for at få det til at skrive '1. december 1969', men det er i hvertfald ikke min kode, der gør det  =)

Jeg kan se i denne tråd, at du roder lidt rundt i PHP's tidsformatering (og det kbiber såmænd også for de andre i tråden at se det), så mon ikke, det er noget lignende, du gør, når du tester koden ovenfor?
Avatar billede Slettet bruger
15. december 2012 - 21:21 #17
#15 - Det kan der jo være noget om : (

Jeg har lige prøvet at køre min version igennem 10.000 gange
- Det tog 14 sekunder, svarende til 1,4 millisekunder pr. sidevisning.

Din version (som, ganske rigtigt fungerer helt fint som den er)
- Tager 13 sekunder for 100.000 gennemkørsler!

Din kode er altså cirka 10 gange hurtigere (dog uden ugedagsnavne)

Til gengæld er den ekstremt indviklet og nærmest umulig at læse.
- Det anser jeg for vigtigere sålænge siden ikke har millioner af hits pr dag..

OK, det er en efterrationalisering (og jeg blev overrasket). Men alligevel... Overoptimering ?
Avatar billede Slettet bruger
15. december 2012 - 21:27 #18
#14 - timestampet i databasen har ikke noget at gøre med den dato brugeren ser!
- det kommer fra value i den option brugeren vælger.

Men da det er PHP's tidsformat (antal sekunder siden 1. januar 1970)
- kan det jo formateres som du vil når formen kommer tilbage til serveren.
Avatar billede olebole Juniormester
15. december 2012 - 21:56 #19
"Til gengæld er den ekstremt indviklet og nærmest umulig at læse"

Det må komme an på, hvad man er vandt til at sidde med af koder. Er ovenstående 'ekstremt indviklet og uforståelig', skal der godt nok ikke meget til at forvirre dig! Men det hænger vel sammen med, at det overhovedet kan overraske dig, at din kode performer så skidt.

Til dit spørgsmål om overoptimering: Ikke spor! Det er bare fornuftig kode, der er tænkt en smule over  =)

Tankegangen bag min kode er fuldstændig elementær. Den hænger nøje sammen med, at det første, du lærer, når du begynder med løkker: Skriv aldrig:

for ($i=0; $i<count($myArray); $i++)

- men:

for ($i=0,$j=count($myArray); $i<$j; $i++)

- netop for at undgå at slå antallet af array'ets elementer op ved hvert gennemløb. Det performer elendigt - og det er end ikke en beregning/instantiering, men 'bare' en aflæsning af en property på array'et.

Det er præcis samme 'programmatiske børnelærdom', der ligger bag at undgå alle de unødige instantieringer af date objektet
Avatar billede Slettet bruger
15. december 2012 - 23:02 #20
Har De det bedre nu, hvor De igen, igen har overdænget mig med lort, Lektor Blomme ?
- den selvforherligende, stoltserende stil er voldsomt (og helt unødvendigt) provokerende!

Jeg fastholder at din løsning, som den foreligger, er komplet ulæselig.
- det vil tage enhver (bortset fra dig selv de næste 3 dage) adskillige minutter at gennemskue/ændre.

Overoptimering: 1.4 millisekunder er ikke et "performance problem" for andre end google.com - Slut!
Avatar billede olebole Juniormester
15. december 2012 - 23:23 #21
*LoL* 'Lektor Blomme' ... Herregud, hvor tager du dog ikke Stalin, Hitler og Breivik med i din offerdyrkelse?  :D

Der er ingen andre end dig, der sludrer om 1.4 millisekund. For mig handler det om, at holde en god og effektiv kodestil. Jeg lever af at udvikle, og så har man ikke tid til at sidde og tage tid på hver eneste linje kode, man skriver. Derfor overholder man som professionel gode, gennemprøvede grundregler, så man er sikker, når det virkelig gælder.

Du må fastholde, hvad som helst - men jeg kender rigtig mange, der absolut ingen problemer har med at læse den kode. Du har næppe indsigt i, hvad 'enhver' kan læse - endsige hvad jeg kan læse om tre dage. Hold dig til at afgøre, hvad du selv kan finde ud af, please  *o)
Avatar billede Slettet bruger
16. december 2012 - 00:01 #22
Jeg har på fornemmelsen af at du mere lever for end af at udvikle.

Jeg har selv levet af det i 25 år, og kan (igen) fortælle dig at læs- og vedligeholdbar kode er meget vigtigere end minimale performance gevinster.

- Stalin, Hitler og Breivik er/var massemordere, Lektor Blomme bare en sølle lille selvfed sadist.
Avatar billede olebole Juniormester
16. december 2012 - 00:23 #23
Nå, dét er forskellen ... jaja, it takes one to know one  =)

Dine 'fornemmelser' vil jeg gerne blande mig uden om, og hvad dine erfaringer angår, så er det forlængst gået op for mig, du har besvær med at læse ovennævnte kode.

Det ændrer ikke ved det faktum, at det er hel elementær programmeringslærdom at foretage sig så lidt som muligt i et loop. Det står på første linje i forordet til enhver lærebog i ethvert sprog!

Derudover kan der sagtens være en faktor 10 til forskel på RAM-forbruget ved to fremgangsmåder - selvom der kun er få procents forskel i afviklingstiden. Det handler om garbage collection, og her trækker objekt instantiering ofte tænder ud.
Avatar billede techboy992 Praktikant
03. februar 2013 - 08:13 #24
Jeg lukker det her spoergsmaal det er loebet af sporet
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester