php 实现hashmap
实现方式一:使用关联数组(Associative Array)
PHP的关联数组本质上就是哈希表的实现,可以直接用于模拟HashMap的功能。关联数组通过键值对存储数据,键可以是整数或字符串。

$hashMap = [];
$hashMap["key1"] = "value1";
$hashMap["key2"] = "value2";
// 检查键是否存在
if (array_key_exists("key1", $hashMap)) {
echo $hashMap["key1"]; // 输出: value1
}
// 遍历HashMap
foreach ($hashMap as $key => $value) {
echo "Key: $key, Value: $value\n";
}
// 删除元素
unset($hashMap["key1"]);
实现方式二:使用SplObjectStorage类
如果需要以对象作为键,可以使用PHP的SplObjectStorage类,它专门设计用于存储对象键值对。

$storage = new SplObjectStorage();
$key1 = new stdClass();
$key2 = new stdClass();
$storage[$key1] = "value1";
$storage[$key2] = "value2";
// 检查键是否存在
if ($storage->contains($key1)) {
echo $storage[$key1]; // 输出: value1
}
// 遍历
foreach ($storage as $key) {
echo "Value: " . $storage[$key] . "\n";
}
// 删除元素
$storage->detach($key1);
实现方式三:自定义HashMap类
如果需要更复杂的HashMap实现,可以封装一个自定义类,提供更丰富的操作方法。
class HashMap {
private $array = [];
public function put($key, $value) {
$this->array[$key] = $value;
}
public function get($key) {
return $this->array[$key] ?? null;
}
public function containsKey($key) {
return array_key_exists($key, $this->array);
}
public function remove($key) {
unset($this->array[$key]);
}
public function size() {
return count($this->array);
}
public function clear() {
$this->array = [];
}
public function keys() {
return array_keys($this->array);
}
public function values() {
return array_values($this->array);
}
}
// 使用示例
$map = new HashMap();
$map->put("name", "John");
$map->put("age", 30);
echo $map->get("name"); // 输出: John
实现方式四:使用哈希函数处理复杂键
如果需要使用复杂对象或数组作为键,可以先将其序列化或哈希化。
$hashMap = [];
function getHashKey($obj) {
if (is_object($obj)) {
return spl_object_hash($obj);
} elseif (is_array($obj)) {
return md5(json_encode($obj));
}
return (string)$obj;
}
$key1 = ["category" => "books", "id" => 123];
$key2 = new stdClass();
$hashMap[getHashKey($key1)] = "Value for array key";
$hashMap[getHashKey($key2)] = "Value for object key";
echo $hashMap[getHashKey($key1)]; // 输出: Value for array key
注意事项
PHP的数组已经是非常高效的哈希表实现,在大多数情况下直接使用关联数组即可满足需求。自定义HashMap类主要适用于需要封装特定业务逻辑的场景。对于对象作为键的情况,SplObjectStorage提供了更好的解决方案。






