Schreibe einen Kommentar

PHP 5: Standard-Datenstrukturen nicht neu erfinden – Queues, Stacks und Co.

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:

Siehe auch
Wie auch PHP entwickelt sich die SPL ständig weiter, und es kommen eventuell neue Datenstrukturen hinzu. Aktuelle Informationen finden Sie im PHP-Manual unter http://de.php.net/manual/spl.datastructures.php. Die Rezepte 8.7 und 4.27 zeigen detailliert den Umgang mit SplFixedArray und SplObjectStorage.

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 Methode
compare() 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.

Auszug aus der Neuauflage des PHP5 Kochbuchs phpckbk3ger.s

Sag's weiter:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert