php 实现hashset
在PHP中,可以通过数组或SplObjectStorage类实现类似HashSet(无序、不重复集合)的功能。以下是几种实现方式:
使用数组模拟HashSet
PHP的数组可以模拟HashSet的行为,利用键的唯一性存储不重复的值。注意键的哈希逻辑需自行处理。
$hashSet = [];
// 添加元素(值作为键)
function addToHashSet(&$hashSet, $value) {
$hashSet[$value] = true;
}
// 检查元素是否存在
function containsInHashSet($hashSet, $value) {
return isset($hashSet[$value]);
}
// 删除元素
function removeFromHashSet(&$hashSet, $value) {
unset($hashSet[$value]);
}
// 示例用法
addToHashSet($hashSet, "apple");
addToHashSet($hashSet, "banana");
var_dump(containsInHashSet($hashSet, "apple")); // 输出: bool(true)
removeFromHashSet($hashSet, "apple");
var_dump(containsInHashSet($hashSet, "apple")); // 输出: bool(false)
使用SplObjectStorage存储对象
若需存储对象实例,SplObjectStorage是更高效的选择,它天然支持对象哈希。
$hashSet = new SplObjectStorage();
$obj1 = new stdClass();
$obj2 = new stdClass();
// 添加对象
$hashSet->attach($obj1);
$hashSet->attach($obj2);
// 检查对象是否存在
var_dump($hashSet->contains($obj1)); // 输出: bool(true)
// 删除对象
$hashSet->detach($obj1);
var_dump($hashSet->contains($obj1)); // 输出: bool(false)
自定义类封装HashSet
为提升复用性,可封装一个类,结合数组或SplObjectStorage实现完整功能:
class HashSet {
private $elements = [];
public function add($value) {
$this->elements[$value] = true;
}
public function contains($value) {
return isset($this->elements[$value]);
}
public function remove($value) {
unset($this->elements[$value]);
}
public function size() {
return count($this->elements);
}
}
// 示例用法
$set = new HashSet();
$set->add("cat");
$set->add("dog");
echo $set->size(); // 输出: 2
注意事项
- 标量值:直接使用数组键存储字符串或数字时需注意类型严格性(如
"1"和1不同)。 - 对象哈希:
SplObjectStorage仅适用于对象,其哈希基于对象标识符。 - 性能:数组的
isset和unset操作均为O(1)时间复杂度,适合高频操作。
以上方法可根据实际需求选择,数组方案适合简单场景,而对象集合推荐使用SplObjectStorage。







