Signatur
Beschreibung
Ds\Vector ist eine dynamisch wachsende, indexbasierte Liste, die Werte in einem zusammenhängenden Speicherblock hält. Sie ist damit das direkte Pendant zu PHP-Arrays, wenn nur numerische, lückenlose Indizes benötigt werden. Der Speicher wird intern als C-ähnliches Array verwaltet, was zufälligen Zugriff per Index in O(1) ermöglicht.
Im Vergleich zu nativen PHP-Arrays benötigt ein Ds\Vector deutlich weniger Arbeitsspeicher, da keine Hash-Tabellen-Overhead-Strukturen erzeugt werden. Einfügen am Ende (push) und Entfernen am Ende (pop) laufen in amortisiert O(1); Einfügen oder Entfernen in der Mitte kostet O(n), da nachfolgende Elemente verschoben werden müssen.
Ds\Vector eignet sich ideal, wenn eine geordnete Sammlung von Werten benötigt wird, die häufig am Ende wächst oder schrumpft, und bei der wahlfreier Index-Zugriff wichtig ist. Es implementiert das Interface Ds\Sequence, das Methoden wie push, pop, insert, remove, get, set, sort, filter, map, slice und viele weitere bereitstellt.
Voraussetzung ist die PECL-Extension ds (installierbar via pecl install ds). Ab PHP 8.0 empfiehlt sich Version 1.4+ der Extension.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $values | iterable | [] | Ein optionales iterierbares Objekt oder Array mit initialen Werten, die sofort in den Vektor eingefügt werden. |
Beispiele
Grundlegende Verwendung: Erstellen, Hinzufügen und Zugreifen
<?php
require_once 'vendor/autoload.php'; // oder PECL ds-Extension geladen
$vector = new Ds\Vector([1, 2, 3]);
// Element hinzufügen
$vector->push(4);
$vector->push(5);
// Zugriff per Index
echo $vector->get(0); // 1
echo $vector->get(4); // 5
// Iteration
foreach ($vector as $index => $value) {
echo "[$index] => $value\n";
}
// Anzahl der Elemente
echo $vector->count(); // 5
Sortieren, Filtern und Mappen
<?php
$vector = new Ds\Vector([5, 3, 8, 1, 9, 2]);
// Sortieren (gibt neuen Vektor zurück)
$sorted = $vector->sorted();
echo implode(', ', $sorted->toArray()); // 1, 2, 3, 5, 8, 9
// Filtern: nur gerade Zahlen
$even = $vector->filter(fn($x) => $x % 2 === 0);
echo implode(', ', $even->toArray()); // 8, 2
// Mappen: alle Werte verdoppeln
$doubled = $vector->map(fn($x) => $x * 2);
echo implode(', ', $doubled->toArray()); // 10, 6, 16, 2, 18, 4
// Einfügen in der Mitte
$vector->insert(2, 99);
echo $vector->get(2); // 99
Kapazitätsverwaltung und Speicherersparnis
<?php
$vector = new Ds\Vector();
// Kapazität vorab reservieren (vermeidet wiederholtes Reallokieren)
$vector->allocate(1000);
echo $vector->capacity(); // mindestens 1000
for ($i = 0; $i < 1000; $i++) {
$vector->push($i);
}
// Überschüssige Kapazität freigeben
$vector->shrink();
echo $vector->capacity(); // genau 1000 (oder systemspezifisch)
// Vergleich: JSON-Konvertierung
$json = json_encode($vector->toArray());
echo strlen($json) > 0 ? 'JSON OK' : 'Fehler';
// Wichtig · Fallstricke
Extension erforderlich: Ds\Vector ist nicht Teil des PHP-Kerns, sondern gehört zur PECL-Extension ds. Sie muss separat installiert werden: pecl install ds und anschließend in der php.ini mit extension=ds aktiviert werden.
Kein string-Schlüssel-Zugriff: Im Gegensatz zu PHP-Arrays unterstützt Ds\Vector keine assoziativen Schlüssel. Wird ein nicht-numerischer Index benötigt, sollte stattdessen Ds\Map verwendet werden.
Lücken nicht erlaubt: Ein Ds\Vector ist immer lückenlos (dicht). Das Entfernen eines Elements aus der Mitte verschiebt alle nachfolgenden Elemente, was O(n)-Kosten verursacht. Für häufige Löschoperationen in der Mitte ist Ds\Deque oft geeigneter.
Serialisierung: Ds\Vector implementiert Serializable, kann also mit serialize() / unserialize() gespeichert werden. json_encode() erfordert den Aufruf von toArray().