|

Themen:

Gleichmässige Verteilung (dynamische Schleife)

Aufgabe: Jeder Artikel der in einem Redaktionssystem erstellt wurde, soll nach einer bestimmten Anzahl an Tagen automatisch wieder vorgelegt werden. Dabei wird beim Speichern ein Wiedervorlagedatum gesetzt. Damit kein scheinbarer Backlog entsteht, soll bei der Vergabe des Wiedervorlagedatums berücksichtigt werden, wie viele Artikel an dem Tag bereits zu Prüfung geplant sind. Ggf. soll das nächst mögliche Datum ermittelt und genommen werden. Mit folgendem Quelltext wird das richtige Wiedervorlagedatum ermittelt.

Quelltext mit Erläuterung:

$nexttime = 100;    

Ich lege die Wiedervorlage in Tagen fest. Hier sind es 100 Tage. Der Wert könnte aber auch vom Eingabeformular mit übergeben werden. Aufjedenfall soll in diesem Beispiel der Artikel in 100 Tagen wieder vorgelegt werden.

$unixstamp = time() + ($nexttime * 24 * 60 * 60);

Jetzt nehme ich den aktuellen Zeitpunkt in Sekunden und Rechne die Anzahl an Tage aus $nexttime oben drauf. Dazu muss ich die 100 Tage in der Klammer natürlich erstmal in Sekunden umrechnen.

$date = date(‚Y-m-d‘, $unixstamp);

Jetzt mit date wieder ein lesbares Format aus dem Sekunden-Unix-Timestamp gemacht und in der Variable $date abgelegt. Ich wähle dabei gleich das amerikanische Datumsformat, da nur dieses in der Datenbank korrekt verarbeitet wird.

$s = 1;

Ich lege den Wert $s fest. Diesen benötige ich als Entscheider für die kommenden while-Schleife.

while ($s < 2)

Die Schleife mit while findet immer dann Anwendung, wenn man vorher nicht weiß, wie oft die Schleife durchlaufen soll. Die Schleife läuft also so oft durch, bis die Bedingung in der Klammer erfüllt ist.

{
$res = mysql_query („SELECT * FROM  `artikel` WHERE  `Datum` LIKE  ‚$date’“);
$num = mysql_num_rows ($res);

In der Schleife wird jetzt geprüft wie viele Artikel es für den Tag schon gibt.

if ($num >= 6)

Wenn an dem Tag bereits mehr als 6 Artikel wieder vor gelegt werden, dann….

{
$nexttime++;
$unixstamp = time() + ($nexttime * 24 * 60 * 60);
$date = date(‚Y-m-d‘, $unixstamp);
}

…Erhöhen wir $nexttime um einen Tag und errechnen das neue Wiedervorlagedatum und checken dann erneut ob es noch „freie Plätze“ an dem Tag gibt. Die Bedingung für die Schleife ist ja noch nicht erfüllt.

else
{
$s++;

Ist ein Datum gefunden, wird die Variable $s um einen Erhöht und damit ist die Bedingung zur Beendigung der While-Schleife erfüllt. Im Anschluss kommt dann das eigentlich Anlegen des Artikels.

Gedanken was noch geht:

Auch die Anzahl der möglichen Wiedervorlagen pro Tag könnte dynamisch ausgelesen werden. Dazu einfach alle aktuellen Artikel zählen und durch 365 rechnen. Erhöht sich die Anzahl an Artikeln erhöht sich auch die Anzahl der Wiedervorlagen pro Tag.