28. september 2006 - 09:44
Der er
17 kommentarer og 2 løsninger
rækkefølge i dynamisk select-boks
Jeg har følgende kode som skal oprette en select-boks med kvartaler fra 1. kvartal 2005 -> dags dato's kvartal. Det virker vidst nok, men jeg vil godt kunne bestemme at det nyeste kvartal skal stå øverst. Jeg er åben for ethvert forslag især hvis der er en smartere måde at lave det på. <?php if(substr($STAT_START_DATO, 0, 4) > 2005) { $tmp_aar = substr($STAT_START_DATO, 0, 4)-2005; $aar = substr($STAT_START_DATO, 0, 4)-$tmp_aar; } ?> <select name="kvartal" > <?php for($i=0;$i<=$tmp_aar;$i++) { $aar += $i; if($ValgtKvartal==substr($aar, 2, 2)."-04"){ ?> <option value="<?php echo $STAT_START_DATO; ?>" selected>4. kvartal <?php echo $aar; ?></option> <?php } elseif($ValgtKvartal<=substr($aar, 2, 2)."-04") { } else { ?> <option value="">4. kvartal <?php echo $aar; ?></option> <?php } if($ValgtKvartal==substr($aar, 2, 2)."-03"){ ?> <option value="<?php echo $STAT_START_DATO; ?>" selected>3. kvartal <?php echo $aar; ?></option> <?php } elseif($ValgtKvartal<=substr($aar, 2, 2)."-03") { }else{ ?> <option value="">3. kvartal <?php echo $aar; ?></option> <?php } if($ValgtKvartal==substr($aar, 2, 2)."-02"){ ?> <option value="<?php echo $STAT_START_DATO; ?>" selected>2. kvartal <?php echo $aar; ?></option> <?php } elseif($ValgtKvartal<=substr($aar, 2, 2)."-02") { }else{ ?> <option value="">2. kvartal <?php echo $aar; ?></option> <?php } if($ValgtKvartal==substr($aar, 2, 2)."-01"){ ?> <option value="<?php echo $STAT_START_DATO; ?>" selected>1. kvartal <?php echo $aar; ?></option> <?php } elseif($ValgtKvartal<=substr($aar, 2, 2)."-01") { }else{ ?> <option value="">1. kvartal <?php echo $aar; ?></option> <?php } } ?> </select>
Annonceindlæg fra Deloitte
28. september 2006 - 11:22
#1
Du kunne lave scriptet meget kortere: 1) Du gentager 4 nogenlunde ens ting? - Hvorfor ikke blot lave én for(), der gentager sig 4 gange til dette? 2) Istedet for at gå ind og ud af php'en kunne du lægge HTML ind i PHP og blot printe den via PHP?
28. september 2006 - 11:34
#2
hvis du kan komme med et fungerende eksempel på den for-løkke du foreslår vil jeg godt implementere den, men jeg har ikke lige selv kunne finde frem til noget.
28. september 2006 - 11:50
#3
Nu sidder jeg ikke med et ftp-adgang. Men jeg vil gerne se på det senere (-- kunne være, at der var en anden herinde, der ville komme med et eksempel før mig ;)
28. september 2006 - 13:39
#4
nu har jeg selv fået rækkefølgen til at virke, men i stedet for at tilføje 1 kvartal tilføjes 1 år. <select name="kvartal" > <?php for($i=$tmp_aar;$i>=0;$i--) { $aar += $i; for($j=0;$j<=12;$j++) { if ($j >= 10) { $dato_kvartal_4 = $aar."-10-01"; } elseif ($j >= 7 && $j <= 9) { $dato_kvartal_3 = $aar."-07-01"; } elseif ($j >= 4 && $j <= 6) { $dato_kvartal_2 = $aar."-04-01"; } else { $dato_kvartal_1 = $aar."-01-01"; } } if ($ValgtKvartal==substr($aar, 2, 2)."-04") { echo "<option value=\"$STAT_START_DATO\" selected>4. kvartal $aar</option>\n"; } elseif ($ValgtKvartal<=substr($aar, 2, 2)."-04") { } else { echo "<option value=\"$dato_kvartal_4\">4. kvartal $aar</option>\n"; } if($ValgtKvartal==substr($aar, 2, 2)."-03"){ echo "<option value=\"$STAT_START_DATO\" selected>3. kvartal $aar</option>\n"; } elseif ($ValgtKvartal<=substr($aar, 2, 2)."-03") { } else { echo "<option value=\"$dato_kvartal_3\">3. kvartal $aar</option>\n"; } if($ValgtKvartal==substr($aar, 2, 2)."-02"){ echo "<option value=\"$STAT_START_DATO\" selected>2. kvartal $aar</option>\n"; } elseif ($ValgtKvartal<=substr($aar, 2, 2)."-02") { } else { echo "<option value=\"$dato_kvartal_2\">2. kvartal $aar</option>\n"; } if($ValgtKvartal==substr($aar, 2, 2)."-01"){ echo "<option value=\"$STAT_START_DATO\" selected>1. kvartal $aar</option>\n"; } elseif ($ValgtKvartal<=substr($aar, 2, 2)."-01") { } else { echo "<option value=\"$dato_kvartal_1\">1. kvartal $aar</option>\n"; } $aar -= $i; } ?> </select>
28. september 2006 - 14:59
#5
OK, nu troede jeg lige jeg havde fået den rigtige tænkehat på, men, men, men... Hvordan får jeg nu tjekket at der ikke skal en option med 4. kvartal 2006, hvis jeg vælger 4. kvartal 2005? Ny kode, lidt kortere og forhåbentligt langt bedre en tidligere ;-) $dato_nu = time(); $mnd = date("m", $dato_nu); $arstal = date("Y", $dato_nu); if ($mnd >= 10) { $dags_kvartal = 4; } elseif ($mnd >= 7 && $mnd <= 9) { $dags_kvartal = 3; } elseif ($mnd >= 4 && $mnd <= 6) { $dags_kvartal = 2; } else { $dags_kvartal = 1; } $tmp_aar = $arstal-2005; $aar = $arstal-$tmp_aar; //echo $tmp_aar."<br>"; //echo $arstal."<br>"; //echo $aar."<br>"; for($j=0;$j<=12;$j++) { if ($j >= 10) { $dato_kvartal_4 = $aar."-10-01"; } elseif ($j >= 7 && $j <= 9) { $dato_kvartal_3 = $aar."-07-01"; } elseif ($j >= 4 && $j <= 6) { $dato_kvartal_2 = $aar."-04-01"; } else { $dato_kvartal_1 = $aar."-01-01"; } } ?> <select name="kvartal" > <?php for($i=$tmp_aar;$i>=0;$i--) { $aar += $i; for ($h=4;$h>=1;$h--) { if ($h == 4) { $dato_kvartal = $aar."-10-01"; } elseif ($h == 3) { $dato_kvartal = $aar."-07-01"; } elseif ($h == 2) { $dato_kvartal = $aar."-04-01"; } else { $dato_kvartal = $aar."-01-01"; } if ($ValgtKvartal==$aar."-0".$h) { echo "<option value=\"$STAT_START_DATO\" selected>$h. kvartal $aar</option>\n"; } elseif ((int)substr($ValgtKvartal, 6, 1) >= $h && $arstal >= $aar) { echo "<option value=\"$dato_kvartal\">$h. kvartal $aar</option>\n"; } elseif ((int)substr($ValgtKvartal, 6, 1) <= $h && $arstal <= $aar) { } else { echo "<option value=\"$dato_kvartal\">$h. kvartal $aar</option>\n"; } } $aar -= $i; } ?> </select>
28. september 2006 - 16:31
#6
28. september 2006 - 16:32
#7
-- Og du bestemmer selvf. selv i scriptet; hvilket år og kvatal, der skal være udgangspunktet ;)
28. september 2006 - 16:33
#8
det ser det umiddelbart ud til... poster du koden, eller evt. bare den del der skal ændres?
28. september 2006 - 16:35
#9
$kvatal_1 = 3; // Givet start-kvatal $kvatal_2 = ceil(date("n", time())/3); // Udregnet slut-kvatal: Oprundet måned/3 = kvatal $aar_1 = 2003; // Givet start-år $aar_2 = date("Y", time()); // udreghet slut-år for($i = 0; $i <= ($aar_2-$aar_1); $i++) // Loop år + diference for($j = 1; $j <= 4; $j++) { // Loop 4 kvataler if($aar_1+$i == $aar_2 && $kvatal_2 >= $j || ($aar_1+$i != $aar_2 && !($aar_1+$i == $aar_1 && $kvatal_1 > $j))) $con[$aar_1+$i][$j] = true; // Matematik; kan sikkert afkortes ;) if($con[$aar_1+$i]) krsort($con[$aar_1+$i]); // Sortering af kvataler, hvis de findes } krsort($con); // Sortering af år print '<select name="kvartal">'."\n"; foreach($con as $a => $b) foreach($b as $c => $d) print ' <option value="'.($aar_1+$i).' '.$j.'">År: '.$a.', kvatal:'.$c.'</option>'."\n"; // Vis indhold print '</select>'."\n";
28. september 2006 - 16:38
#10
hmm, value="" i <option>, skal så bare rettes til $a og $c ;)
28. september 2006 - 16:47
#11
hmm en mindre justering. hvordan for jeg den til at skrive 2005-04-01 i value for 2. kvartal 2005?
28. september 2006 - 17:04
#12
<? $kvatal_1 = 3; // Givet start-kvatal $kvatal_2 = ceil(date("n", time())/3); // Udregnet slut-kvatal: Oprundet måned/3 = kvatal $aar_1 = 2003; // Givet start-år $aar_2 = date("Y", time()); // udreghet slut-år for($i = 0; $i <= ($aar_2-$aar_1); $i++) // Loop år + diference for($j = 1; $j <= 4; $j++) { // Loop 4 kvataler if($aar_1+$i == $aar_2 && $kvatal_2 >= $j || ($aar_1+$i != $aar_2 && !($aar_1+$i == $aar_1 && $kvatal_1 > $j))) $con[$aar_1+$i][$j] = date("Y-m-d", mktime(0,0,0,(($j-1)*3)+1,1,$aar_1+$i)); // Matematik; kan sikkert afkortes ;) if($con[$aar_1+$i]) krsort($con[$aar_1+$i]); // Sortering af kvataler, hvis de findes } krsort($con); // Sortering af år print '<select name="kvartal">'."\n"; foreach($con as $a => $b) foreach($b as $c => $d) print ' <option value="'.$d.'">År: '.$a.', kvatal:'.$c.'</option>'."\n"; // Vis indhold print '</select>'."\n"; ?>
29. september 2006 - 10:57
#13
alle tiders. Det virker, men er der nogen måde udførelsen kan gøres hurtigere?
29. september 2006 - 14:40
#14
performance er vidst god nok alligevel, det var vidst bare min maskine der haltede lidt...
29. september 2006 - 23:34
#15
Hmm, du siger noget med performencen. Scriptet er lavet specielt til det du ønsker; nemlig den "omvendte" data. Måske kunne man via de første 2 for-loop's klarer denne "omvendte" problemstilling. Nu har jeg ikke testet det, men kan man bestemme væredien fx. $i til max værdien og så trække en fra pr. loop? -- altså det omvendte, når man nu normalt lægger en til? Jeg vil gerne kigge på denne problemstilling, men sidder ikke med en ftp-adgang :( For fremtiden vil jeg indlægge en generate-tid i mine testscripts :)
29. september 2006 - 23:47
#16
Som svar til føste del af min problemstilling fra 29/09-2006 23:34:42, kan man godt starte med max værdien, og så trække en fra pr. loop. Så fik jeg testet det, så nu kan jeg konkludere, at det kan man godt :) (Så har jeg også lært lidt ;) Jeg vil gerne prøve at omskrive scriptet så det genereres hurtigere. -- Nu er scriptet ikke så stort, så det er nok ikke så relevant, men jeg vil gerne frembringe den bedste løsning.
30. september 2006 - 23:39
#17
Herunder er en kortere udgave :) Se evt. genereringstid på min testside, som jeg linker til i 28/09-2006 16:31:05. Øverste genereringstid er på det første script - Nederste genereringstid er på scriptet herunder: <? $kvatal_1 = 3; // Givet start-kvatal $kvatal_2 = ceil(date("n", time())/3); // Udregnet slut-kvatal: Oprundet måned/3 = kvatal $aar_1 = 2003; // Givet start-år $aar_2 = date("Y", time()); // udreghet slut-år print '<select name="kvartal">'."\n"; for($i = ($aar_2-$aar_1); $i >= 0; $i--) // Loop år + diference for($j = 4; $j != 0; $j--) { // Loop 4 kvataler if(($aar_1+$i == $aar_2 && $kvatal_1 >= $j) || ($aar_1+$i == $aar_1 && $kvatal_2 <= $j) || ($aar_1+$i != $aar_2 && $aar_1+$i != $aar_1)) print ' <option value="'.date("Y-m-d", mktime(0,0,0,(($j-1)*3)+1,1,$aar_1+$i)).'">År: '.($aar_1+$i).', kvatal:'.$j.'</option>'."\n"; } print '</select>'."\n"; ?>
02. oktober 2006 - 10:34
#18
jeg kan så se at der er en mindre 'bug' i dit script. Den viser ikke det nyeste kvartal. skal det ikke være ($aar_1+$i == $aar_2 && $kvatal_2 <= $j) i stedet for <($aar_1+$i == $aar_1 && $kvatal_2 <= $j)
05. oktober 2006 - 10:24
#19
if()skal blot se således ud: if(($aar_1+$i == $aar_2 && $kvatal_2 >= $j) || ($aar_1+$i != $aar_2 && $aar_1+$i != $aar_1) || ($aar_1+$i == $aar_1 && $kvatal_1 <= $j))
Vi tilbyder markedets bedste kurser inden for webudvikling