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

问题描述 投票:0回答:5

我习惯了 Java,那里有

HashSets
ArrayLists
和其他
Collections
。但我现在正在开发一个 PHP 项目。

我需要创建一个集合,用对象(在本例中为字符串)填充该集合,但该集合只能包含每个对象一次。另外,我想最终从该集合中删除某个对象(如果存在)。使用 Java 集合类这将非常容易。但我如何在 PHP 中实现呢?

我缺少任何

array()
的方法吗?我正在使用 PHP 5.3。

php data-structures spl
5个回答
10
投票

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

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

print_r(array_keys($arr));

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


6
投票

PHP 文档说:

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

所以也许(!)你不需要 HashSet,因为普通数组已经作为一种优化的索引结构实现了:)


2
投票

我不太确定,但我认为

SplObjectStorage
可以满足你的要求:

http://php.net/manual/en/class.splobjectstorage.php

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

$foo['bar'] = true;

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


1
投票
$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


0
投票

从 PHP7 开始有数据结构模块 https://www.php.net/manual/en/book.ds.php

如果可能的话,我会避免使用 SplObjectStorage。

© www.soinside.com 2019 - 2024. All rights reserved.