Schwierig war die Suche nach einer Lösung! PriorityQueue und Stack schienen dann die besseren Ergebnisse zu meinem Problem zu liefern.
Im Grunde ein einfaches Array dem Aufgaben hinzugefügt werden, ABER:

  • Ich habe eine Liste an Aufgaben die dynamisch erzeugt wird
  • Ich kenne die Eigenschaften der Einzelteile aber nicht das Ergebnis der Dynamik in der die Liste erzeugt wird („Fist comes fist serves“ (FIFO = Fist In First Out) reichte in diesem Fall nicht! LIFO (Last In First Out) auch nicht :-/

Beispiel: Im Code werden mehrere Konfigurationen geladen dessen Zeitpunkt unbekannt ist.
Wenn aber alles fertig ist soll los gelegt werden können, wie ich es wünsche, die Aufgaben zu erledigen: PriorityQueue

In PHP gibt es da eine coole Lösung in der SplPriorityQueue. Mein Problem hiermit: Die Reihenfolge um eine Prio-Liste zu setzen war mir zu technisch. Z.b. 99 höchste Prio, 0 = die kleinste Prio. Auch alphanumerisch ist es möglich: Z ist höher als A, passte aber nicht zu meinem Anwendungsfall.

Ich habe eine Konfiguration und weitere werden zur Laufzeit hinzugefügt. Klassisches FIFO würde man denken. Was zuerst in der Konfiguration steht soll auch benutzt werden. Aber nun gab es die Sonderfälle: Konfiguration 2 musste vor Konfiguration 1 in der Reihenfolge einsortiert werden. Eine Prionummer gab es in diesem Fall nicht um die SPL von PHP zu verwenden.

Ich habe an den entsprechenden Konfigurationen geschraubt und Ihnen eine individuelle ID verpasst und in der Initialisierung der Konfigurationen benutze ich erste einen „Sammler“ Queue Objekt das anhand der IDs eine Reihenfolge prüft und ggf. neu setzt wenn es notwendig wird. Das macht die Sache eines einfachen Arrays als liste zwar zunichte aber dafür flexible 🙂

Beispiel:

queue->add('default', 'default config'); //Z.B. der Kern der Applikation
queue->add('demo', 'demo config');// Erweiterungen
queue->add('news', 'news config');// Erweiterungen

Mein Programm liest die Konfigurationen in dieser Reihenfolge!
Aus irgend einem bestimmten Grund muss aber die „demo“ Konfiguration zuerst zur Verfügung stehen wenn der sog. „bootstrap“ durch ist.

queue->add('default', 'default config');
queue->add('demo', 'demo config', 'before', 'default');
queue->add('news', 'news config');

Als Lösung kommt folgender Code zutage der auch in meiner Library inkl. Tests zur Verfügung steht: MUMSYS Library – A PHP library

Wichtig: Wenn klar ist das die Reihenfolge ohne dieses Object OK ist, sollte so eine Queue nicht unnötig eingesetzt werden!