Signatur
Beschreibung
Ds\Set ist eine Datenstruktur aus der Data Structures-Erweiterung (ext-ds), die eine Sammlung von eindeutigen Werten repräsentiert. Duplikate werden automatisch ignoriert. Die interne Implementierung basiert auf einer Hash-Tabelle, wodurch Operationen wie add(), remove() und contains() im Durchschnitt in O(1) ablaufen.
Im Gegensatz zu SplFixedArray oder gewöhnlichen PHP-Arrays ist Ds\Set speziell für mengentheoretische Operationen ausgelegt: union(), intersect(), diff() und xor() stehen direkt als Methoden zur Verfügung. Die Einfügereihenfolge wird beibehalten.
Ds\Set eignet sich hervorragend, wenn man sicherstellen möchte, dass keine Duplikate in einer Liste existieren, z. B. bei Tag-Sammlungen, eindeutigen Benutzer-IDs oder beim Filtern mehrerer Datenquellen ohne Wiederholungen. Verglichen mit array_unique() auf großen Arrays ist Ds\Set erheblich speicher- und laufzeiteffizienter.
Die Klasse implementiert Ds\Collection und damit auch Countable, IteratorAggregate und JsonSerializable. Werte können beliebige PHP-Typen sein; die Eindeutigkeit wird über strikten Vergleich (===) bestimmt, wobei Objekte per Referenz verglichen werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $values | iterable | [] | Ein optionales Iterable (Array oder Traversable), dessen Elemente als Startwerte in die Menge eingefügt werden. Duplikate werden dabei automatisch verworfen. |
Rückgabewert
Beispiele
Grundlegende Verwendung: Duplikate vermeiden
<?php
require 'vendor/autoload.php'; // oder pecl install ds
$set = new Ds\Set([1, 2, 3, 2, 1, 4]);
echo $set->count() . PHP_EOL; // 4 – Duplikate wurden entfernt
$set->add(5);
$set->add(3); // wird ignoriert
foreach ($set as $value) {
echo $value . ' ';
}
// Ausgabe: 1 2 3 4 5
Mengentheoretische Operationen: union, intersect, diff
<?php
require 'vendor/autoload.php';
$a = new Ds\Set([1, 2, 3, 4]);
$b = new Ds\Set([3, 4, 5, 6]);
// Vereinigung
$union = $a->union($b);
echo 'union: ' . implode(', ', $union->toArray()) . PHP_EOL;
// Schnittmenge
$intersect = $a->intersect($b);
echo 'intersect: ' . implode(', ', $intersect->toArray()) . PHP_EOL;
// Differenz (in $a, aber nicht in $b)
$diff = $a->diff($b);
echo 'diff: ' . implode(', ', $diff->toArray()) . PHP_EOL;
// Symmetrische Differenz (in genau einer der Mengen)
$xor = $a->xor($b);
echo 'xor: ' . implode(', ', $xor->toArray()) . PHP_EOL;
Teilmengen-Prüfung und contains
<?php
require 'vendor/autoload.php';
$tags = new Ds\Set(['php', 'python', 'javascript']);
// Einzelnen Wert prüfen
var_dump($tags->contains('php')); // true
var_dump($tags->contains('rust')); // false
// Mehrere Werte gleichzeitig prüfen
var_dump($tags->contains('php', 'python')); // true – beide vorhanden
// Teilmengenprüfung
$subset = new Ds\Set(['php', 'python']);
var_dump($subset->isSubset($tags)); // true
// Wichtig · Fallstricke
Erweiterung erforderlich: Ds\Set ist nicht im PHP-Kern enthalten. Die Erweiterung muss über PECL installiert werden (pecl install ds) oder als Composer-Paket php-ds/php-ds eingebunden werden.
Vergleichsverhalten: Eindeutigkeit wird per striktem Vergleich (===) geprüft. Das bedeutet, dass 1 (int) und '1' (string) als unterschiedliche Werte gelten. Objekte werden anhand ihrer Referenz verglichen, nicht anhand ihrer Eigenschaften.
Keine schlüsselbasierten Zugriffe: Ds\Set unterstützt im Gegensatz zu Ds\Map keinen Zugriff per Schlüssel. Zum Abrufen eines Elements per Index steht get(int $index) zur Verfügung, welches die Einfügereihenfolge widerspiegelt.
Nicht serialisierbar: Ds\Set implementiert JsonSerializable, jedoch nicht Serializable. Für Persistenz muss toArray() verwendet und das Array serialisiert werden.