php 实现set
PHP 实现 Set 数据结构
在 PHP 中,原生没有直接的 Set 数据结构,但可以通过数组或 SPL (Standard PHP Library) 提供的类来实现类似功能。以下是几种常见的实现方式:
使用数组模拟 Set
PHP 的关联数组可以模拟 Set 的特性,利用键的唯一性来保证元素不重复。
$set = [];
// 添加元素
$set['element1'] = true;
$set['element2'] = true;
// 检查元素是否存在
if (isset($set['element1'])) {
echo 'Element exists';
}
// 删除元素
unset($set['element1']);
使用 SPL 的 SplObjectStorage
如果需要存储对象并确保唯一性,可以使用 SplObjectStorage。
$set = new SplObjectStorage();
$object1 = new stdClass();
$object2 = new stdClass();
// 添加元素
$set->attach($object1);
$set->attach($object2);
// 检查元素是否存在
if ($set->contains($object1)) {
echo 'Object exists';
}
// 删除元素
$set->detach($object1);
使用 array_unique 函数
对于简单的值类型集合,可以先使用数组,再通过 array_unique 去重。
$elements = ['a', 'b', 'a', 'c'];
$set = array_unique($elements);
// 结果: ['a', 'b', 'c']
使用第三方库
如果需要更完整的 Set 功能(如交集、并集等),可以使用第三方库如 doctrine/collections。
use Doctrine\Common\Collections\ArrayCollection;
$set = new ArrayCollection(['a', 'b', 'c']);
// 添加元素
$set->add('d');
// 检查元素是否存在
if ($set->contains('a')) {
echo 'Element exists';
}
自定义 Set 类
可以封装一个简单的 Set 类来提供更清晰的接口。

class Set {
private $elements = [];
public function add($element) {
if (!in_array($element, $this->elements, true)) {
$this->elements[] = $element;
}
}
public function contains($element) {
return in_array($element, $this->elements, true);
}
public function remove($element) {
$index = array_search($element, $this->elements, true);
if ($index !== false) {
array_splice($this->elements, $index, 1);
}
}
public function toArray() {
return $this->elements;
}
}
性能考虑
- 对于大量数据,
in_array和array_search是线性搜索,性能较差。可以考虑用键值对数组优化。 SplObjectStorage对于对象存储更高效,但不适用于普通标量值。






