qua: monatsuebergreifend, jahresuebergreifend....

Hi,

hab mal wieder ein kleines Problem. Sicher, ist nur wieder ein Denkfehler drin, aber ich komm grad nicht drauf.
Also ich hab eine verschachtelte Schleife. Es geht um Datumsfunktionen.
Ich hab eine Anweisung, die innerhalb einer vorher vom Nutzer definierten Zeit:
<input type="text" name="starttag" size="2" maxlength="2">
<select name="startmonat">
   <option value="03">M&auml;rz</option>
   <option value="04">April</option>
   <option value="05">April</option>
</select>
<select name="startjahr">
   <option value="2005">2005</option>
</select>

<input type="text" name="endtag" size="2" maxlength="2">
<select name="endmonat">
   <option value="03">M&auml;rz</option>
   <option value="04">April</option>
   <option value="05">April</option>
</select>
<select name="endjahr">
   <option value="2005">2005</option>
</select>

ausgefuehrt werden soll.
Soweit sogut. Hab ich eine verschachtelte Schleife gebastelt:

for($j=$startjahr;$j<=$endjahr;$j++){
   for($m=$startmonat;$m<=$endmonat;$m++){
      if ($m>12) {
         continue 1;
      }
      for($t=$starttag;$t<=$starttag;$t++){
         if ($t>(date("t", mktime(0, 0, 0, $m, $t, $j)))) {
            continue 1;
         }
            --Anweisung--
      }
   }
}

Nun aber das Problem: Wenn der Nutzer als Startdatum 10.03.05 eingibt und als Enddatum 08.04.05 eingibt, laeuft die Schleife genau zweimal.

Hat jmd einen Loesungsvorschlag fuer mich?

mfg q

  1. Hallo qua,

    Ich hab eine Anweisung, die innerhalb einer vorher vom Nutzer definierten Zeit:
    ...
    ausgefuehrt werden soll.

    Die Anweisung soll also für jeden Tag innerhalb des definierten Zeitraums ausgeführt werden?

    Der Ansatz sieht ok aus, wobei ich dennoch nicht so 100%ig durchsteige. Du berücksichtigst in deiner Konstruktion einen gebrochenen 1 und letzten Monat nicht (richtig).

    Ich würde mit mktime($startzeit) den Startzeitpunkt sezten und die Schleife solange ausführen, bis mktime($startzeit+$lfdTag) >= mktime($endzeit) $lfdTag ist dein Zähler, den du mit jedem Durchlauf um 1 (Tag) inkrementierst.

    Also nur eine Schleife "while()"

    Grüße,

    Jochen

    --
    Heute schon gescribbelt?
    Scribbleboard
    1. Hi Jochen,

      Die Anweisung soll also für jeden Tag innerhalb des definierten Zeitraums ausgeführt werden?

      Richtig!

      Ich würde mit mktime($startzeit) den Startzeitpunkt sezten und die Schleife solange ausführen, bis mktime($startzeit+$lfdTag) >= mktime($endzeit) $lfdTag ist dein Zähler, den du mit jedem Durchlauf um 1 (Tag) inkrementierst.

      Netter Ansatz, aber das ist, wenn ich das jetzt richtig verstanden habe, ungefaehr das gleiche, was ich jetzt schon habe.
      Mein Problem ist:

      Der Benutzer waehlt
      startzeit=08.02.05
      endzeit=09.03.05.
      Die Schleife laeuft genau einmal (09-08).

      Oder der Benutzer waehlt
      startzeit=08.02.05
      endzeit=05.03.05.
      Der Schleifenkopf ist nicht erfuellt - die Schleife laeuft gar nicht.
      ...
      Oder hab ich da jetzt wieder nen Denkfehler?

      mfg q

      1. Hallo.

        Der Schleifenkopf ist nicht erfuellt - die Schleife laeuft gar nicht.
        ...
        Oder hab ich da jetzt wieder nen Denkfehler?

        Vielleicht hast du einen Knoten in der Schleife.
        MfG, at

      2. Hi qua,

        Ich würde mit mktime($startzeit) den Startzeitpunkt sezten und die Schleife solange ausführen, bis mktime($startzeit+$lfdTag) >= mktime($endzeit) $lfdTag ist dein Zähler, den du mit jedem Durchlauf um 1 (Tag) inkrementierst.

        Netter Ansatz, aber das ist, wenn ich das jetzt richtig verstanden habe, ungefaehr das gleiche, was ich jetzt schon habe.

        ungefähr ja. Aber nur ungefähr ...

        Oder hab ich da jetzt wieder nen Denkfehler?

        ja, $monat, $tag, $jahr sind dein Startzeitpunkt.

        while (mktime(0,0,0, $monat, $tag, $jahr) <=  mktime($ende))
          {
          machwas();
          $tag ++;

        Habe ich mich mit meiner ersten Ausführung (oben) so undeutlich ausgedrückt?

        Oder guck bei http://www.php.net/manual/de/function.mktime.php#39705 vorbei. Die Funktion dürfte dir auch gefallen.

        Grüße,

        Jochen

        --
        Heute schon gescribbelt?
        Scribbleboard
  2. Hi,

    for($j=$startjahr;$j<=$endjahr;$j++){

    soweit, sogut...

    for($m=$startmonat;$m<=$endmonat;$m++){
          if ($m>12) {
             continue 1;
          }

    Wie kann die Bedingung ($m > 12) denn zutreffen, wenn im Schleifenkopf steht, dass $m <= $endmonat sein soll?

    for($t=$starttag;$t<=$starttag;$t++){

    Diese Bedingung ($t <= $starttag) wird genau einmal zutreffen.

    if ($t>(date("t", mktime(0, 0, 0, $m, $t, $j)))) {

    Diese Bedingung kann frühestens beim zweiten Durchlauf zutreffen - aber die Schleife läuft ja nur ein Mal...

    continue 1;
             }
                --Anweisung--
          }
       }
    }

    Nun aber das Problem: Wenn der Nutzer als Startdatum 10.03.05 eingibt und als Enddatum 08.04.05 eingibt, laeuft die Schleife genau zweimal.

    naja - die Schleife um $t läuft _immer_ nur ein Mal. Da die Schleife um $m zwei Mal läuft, passt es doch ;-)

    Gruß,
    Andreas.