Avatar billede sw_red_6 Nybegynder
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>
Avatar billede hmm10 Nybegynder
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?
Avatar billede sw_red_6 Nybegynder
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.
Avatar billede hmm10 Nybegynder
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 ;)
Avatar billede sw_red_6 Nybegynder
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>
Avatar billede sw_red_6 Nybegynder
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>
Avatar billede hmm10 Nybegynder
28. september 2006 - 16:31 #6
Avatar billede hmm10 Nybegynder
28. september 2006 - 16:32 #7
-- Og du bestemmer selvf. selv i scriptet; hvilket år og kvatal, der skal være udgangspunktet ;)
Avatar billede sw_red_6 Nybegynder
28. september 2006 - 16:33 #8
det ser det umiddelbart ud til...
poster du koden, eller evt. bare den del der skal ændres?
Avatar billede hmm10 Nybegynder
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";
Avatar billede hmm10 Nybegynder
28. september 2006 - 16:38 #10
hmm, value="" i <option>, skal så bare rettes til $a og $c ;)
Avatar billede sw_red_6 Nybegynder
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?
Avatar billede hmm10 Nybegynder
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";

?>
Avatar billede sw_red_6 Nybegynder
29. september 2006 - 10:57 #13
alle tiders. Det virker, men er der nogen måde udførelsen kan gøres hurtigere?
Avatar billede sw_red_6 Nybegynder
29. september 2006 - 14:40 #14
performance er vidst god nok alligevel, det var vidst bare min maskine der haltede lidt...
Avatar billede hmm10 Nybegynder
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 :)
Avatar billede hmm10 Nybegynder
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.
Avatar billede hmm10 Nybegynder
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";

?>
Avatar billede sw_red_6 Nybegynder
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)
Avatar billede hmm10 Nybegynder
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))
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