Problem
Sie benötigen in Ihrem Programm Datenstrukturen, die PHP nicht out-of-the-box bietet (z.B. Stack, Linked-List oder Queue). Sie könnten diese mithilfe von Arrays als eigene Klasse implementieren, sind sich aber nicht sicher, ob Sie dabei nicht unnötig das Rad neu erfinden.
Lösung
Seit PHP 5.3 bietet die Standard PHP Library (SPL) einige dieser Datenstrukturen an. Die Klasse SplStack implementiert eine LIFO-Datenstruktur (Last-In-First-Out) und somit eine Datenstruktur, die sich wie ein Stack (engl. für Stapel) verhält:
$stack = new SplStack(); $stack->push('a'); $stack->push('b'); $stack->push('c'); echo $stack->pop()."\n"; echo $stack->pop()."\n"; echo $stack->pop()."\n";c b a
Die Klassen SplHeap, SplMinHeap
und SplMaxHeap
implementieren eine Heap-Datenstruktur.SplHeap ist dabei eine abstrakte Klasse und kann nicht direkt instantiiert werden. In einem Heap werden die einzelnen Elemente anhand ihrer Schlüsselwerte in einer Baumstruktur abgelegt. SplMinHeap
und SplMaxHeap
implementieren jeweils die von SplHeap
als abstrakt deklarierte Funktion compare()
. SplMinHeap
legt die hinzugefügten Elemente in aufsteigend sortierter Reihenfolge ab, SplMaxHeap
dagegen in absteigend sortierter Reihenfolge:
$heap = new SplMaxHeap(); $heap->insert('b'); $heap->insert('a'); $heap->insert('c'); echo $heap->extract()."\n"; echo $heap->extract()."\n"; echo $heap->extract()."\n";c b a$heap = new SplMinHeap(); $heap->insert('b'); $heap->insert('a'); $heap->insert('c'); echo $heap->extract()."\n"; echo $heap->extract()."\n"; echo $heap->extract()."\n";a b c
Mit der Klasse SplPriorityQueue
kann eine Queue erstellt werden, die ihre Elemente nach einer definierten Priorität sortiert und nicht nach der FIFO-(First-In-First-Out-)Reihenfolge einer »normalen« Queue:
$queue = new SplPriorityQueue(); $queue->insert('niedrig', 1); $queue->insert('hoch', 3); $queue->insert('mittel', 2); echo 'TOP Element: '.$queue->top()."\n"; echo $queue->extract()."\n"; echo $queue->extract()."\n"; echo $queue->extract()."\n";TOP Element: hoch hoch mittel niedrig
Diskussion
Sämtliche SPL-Datenstrukturen sind in der Sprache C implementierte PHP-Klassen. Dadurch sind sie sehr effizient. Neben den gezeigten Klassen existieren noch diverse weitere Datenstrukturen. Die nachfolgende Tabelle gibt Ihnen einen Überblick über die verfügbaren Klassen:
Klasse | Beschreibung |
---|---|
SplDoublyLinkedList |
Doppelt verkettete Liste. |
SplStack |
Stapel bzw. Stack-Datenstruktur. |
SplQueue |
Schlange bzw. Queue-Datenstruktur. |
SplHeap |
Haufen bzw. Heap-Datenstruktur. Diese Klasse definiert die abstrakte Methodecompare() und kann nicht direkt instantiiert werden. |
SplMaxHeap |
Heap-Datenstruktur, deren größtes Element immer an oberster Stelle liegt. |
SplMinHeap |
Heap-Datenstruktur, deren kleinstes Element immer an oberster Stelle liegt. |
SplPriorityQueue |
Eine Queue-Datenstruktur, deren Elementen Prioritäten zugeordnet sind, woraus sich die Sortierreihenfolge ergibt. |
SplFixedArray |
Eine Array-Datenstruktur fester Größe. Es sind nur Integer-Werte als Keys erlaubt, deren Wert zwischen 0 und der angegebenen maximalen Größe liegt. |
SplObjectStorage |
Eine Map-Datenstruktur, deren Schlüssel Objekte sind. Erlaubt ein Mapping von Objekten auf zugeordnete Daten oder kann als Mengen-Datenstruktur (Set) für Objekte genutzt werden. |