php实现集合
PHP 实现集合功能
在 PHP 中实现集合(Set)功能可以通过多种方式完成,以下是几种常见的方法:
使用数组模拟集合
PHP 数组可以模拟集合的基本功能,通过键的唯一性实现元素不重复。
$set = [];
$set['element1'] = true; // 添加元素
$set['element2'] = true;
unset($set['element1']); // 移除元素
if (isset($set['element2'])) { // 检查元素是否存在
// 元素存在
}
使用 SplObjectStorage 类
SplObjectStorage 是 PHP 标准库提供的专门用于对象存储的集合类。

$set = new SplObjectStorage();
$obj1 = new stdClass();
$obj2 = new stdClass();
$set->attach($obj1); // 添加元素
$set->attach($obj2);
$set->detach($obj1); // 移除元素
if ($set->contains($obj2)) { // 检查元素是否存在
// 元素存在
}
使用第三方库
可以使用专门的集合库如 Doctrine Collections 或 Laravel Collections 提供更丰富的集合操作。
Doctrine Collections 示例:

use Doctrine\Common\Collections\ArrayCollection;
$set = new ArrayCollection([1, 2, 3]);
$set->add(4); // 添加元素
$set->removeElement(2); // 移除元素
if ($set->contains(3)) { // 检查元素存在
// 元素存在
}
Laravel Collections 示例:
use Illuminate\Support\Collection;
$set = new Collection([1, 2, 3]);
$set = $set->add(4); // 添加元素
$set = $set->reject(function ($item) {
return $item === 2; // 移除元素
});
if ($set->contains(3)) { // 检查元素存在
// 元素存在
}
自定义集合类
可以创建自定义的集合类实现特定需求:
class Set implements \Countable, \IteratorAggregate
{
private $elements = [];
public function add($element): void
{
if (!in_array($element, $this->elements, true)) {
$this->elements[] = $element;
}
}
public function remove($element): void
{
$index = array_search($element, $this->elements, true);
if ($index !== false) {
unset($this->elements[$index]);
$this->elements = array_values($this->elements);
}
}
public function contains($element): bool
{
return in_array($element, $this->elements, true);
}
public function count(): int
{
return count($this->elements);
}
public function getIterator(): \Traversable
{
return new \ArrayIterator($this->elements);
}
}
集合运算实现
可以在自定义集合类中实现常见的集合运算:
// 并集
public function union(Set $other): Set
{
$newSet = new Set();
foreach ($this as $element) {
$newSet->add($element);
}
foreach ($other as $element) {
$newSet->add($element);
}
return $newSet;
}
// 交集
public function intersect(Set $other): Set
{
$newSet = new Set();
foreach ($this as $element) {
if ($other->contains($element)) {
$newSet->add($element);
}
}
return $newSet;
}
// 差集
public function diff(Set $other): Set
{
$newSet = new Set();
foreach ($this as $element) {
if (!$other->contains($element)) {
$newSet->add($element);
}
}
return $newSet;
}
选择哪种实现方式取决于具体需求,简单场景可以使用数组或 SplObjectStorage,复杂场景建议使用第三方集合库或自定义集合类。






