Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP5.x是否有某种HashSet或Set类?_Php_Data Structures_Spl - Fatal编程技术网

PHP5.x是否有某种HashSet或Set类?

PHP5.x是否有某种HashSet或Set类?,php,data-structures,spl,Php,Data Structures,Spl,我习惯于Java,在Java中我有哈希集,数组列表和其他集合。但我现在正在做一个PHP项目 我需要创建一个集合,用对象(本例中为字符串)填充该集合,但集合只能包含每个对象一次。此外,如果某个对象存在,我希望最终从该集中删除该对象。这对于Java集合类来说非常简单。但是我如何在PHP中实现它呢 是否有我缺少的array()方法?我使用的是PHP 5.3。我不太确定,但我认为SplObjectStorage可以满足您的需要: 哦,字符串不是对象。所以你可以这样做: $foo['bar'] = tr

我习惯于Java,在Java中我有
哈希集
数组列表
和其他
集合
。但我现在正在做一个PHP项目

我需要创建一个集合,用对象(本例中为字符串)填充该集合,但集合只能包含每个对象一次。此外,如果某个对象存在,我希望最终从该集中删除该对象。这对于Java集合类来说非常简单。但是我如何在PHP中实现它呢


是否有我缺少的
array()
方法?我使用的是PHP 5.3。

我不太确定,但我认为
SplObjectStorage
可以满足您的需要:

哦,字符串不是对象。所以你可以这样做:

$foo['bar'] = true;

数组将作为唯一存储字符串的一种方式。

PHP文档说明:

PHP中的数组实际上是一个有序映射。地图是一种 将值与键关联。此类型针对几个方面进行了优化 不同用途;可以将其视为数组、列表(向量)、哈希 表(映射的实现)、字典、集合、堆栈、, 排队,可能更多。因为数组值可以是其他数组,所以树 多维数组也是可能的


所以maybee(!)您不需要哈希集,因为普通数组已经实现为一种优化的索引结构:)

如果它只是字符串,您可以使用数组作为集:

$arr['str1'] = null;
$arr['str2'] = null;
$arr['str1'] = null;

print_r(array_keys($arr));
唯一的潜在问题是,如果可能的话,数字字符串会隐式转换为整数。但这在PHP中通常不是问题,因为在大多数情况下类型并不重要

$values = array(1, 3, 6, 4, 3, 3, 7, 1);
$hashset = array();
foreach ($values as $value){
    if (!array_key_exists($value, $hashset)){
        echo $value." ";
        $hashset[$value] = true;
    }
}
印刷品:
1 3 6 4 7

SplObjectStorage可以作为集合使用,但前提是您同意使用标识作为相等。5.4在SplObjectStorage中添加了一个getHash方法,但从代码上看,它似乎并不是Java中用于性能的哈希代码,但实际上equal hash也意味着对象相等。我认为你的答案最接近正确,但以这种方式实现类似集合的数据结构仍然让人感觉不舒服。@PascalKlein呃,我有点喜欢有一个数据结构可以完成所有的工作。要跟踪的类型越来越少:)@PascalKlein,这只是许多年后的事了,但实际上Java哈希集就是这样工作的。它在检查您添加的内容是否重复方面做得更多,但支持对象是一个HashMap。我同意,如果PHP实现一个HashSet来提供相同或类似的功能,那就太好了。我的代码可能会变得更干净,或者存在其他一些技巧来模拟HashSet,但它仍然不能提供名为HashSet的类所能提供的可读性。问题是如何只存储唯一的项,而不是是否有一个基本的数据结构,如“一刀切”数组。