PHP有Set数据结构吗?

20

我是PHP的新手,无法理解这个基本问题。PHP是否有一种类似于数组但具有动态添加或删除任意数量对象的集合或列表对象?

7个回答

14
PHP7+的答案:使用官方的PHP-DS扩展。它比使用数组的hacky解决方案更有效率。虽然集合有一些限制,但大多数典型的操作都更快且提供更好的接口。

https://www.php.net/manual/en/book.ds.php

<?php

use Ds\Set;

$numbers = new Set([1, 2, 3]);

$numbers->sum(); 

$numbers->diff(new Set([2, 3, 4]))
    ->union(new Set([3, 4, 5]))
    ->remove(...[3, 4])

7
是的,您可以使用数组对象和数组函数来实现。基本上,您可以使用array_push函数或$arrayName[] = ...表示法(其中arrayName是您的数组名称)动态增加数组。请注意保留HTML标记。

4
PHP 数组提供了 ListHashMap,但不提供 Set。通过使用数组的键来模拟 Set,可以通过 HashMap 接口实现。请注意,此方法要求元素必须是可哈希的(即不能是对象)。 - dtech
1
但是你只能拥有标量类型的集合。如果我没错的话,这是一个不好的解决方案。 - ribamar
2
这已经过时了,它不会创建一个Set,只是一个普通的数组。问题的标题是误导性的。OP并不是在寻找一个Set,而是在寻找向数组中添加元素的方法。如果你正在寻找一个Set,请看下面@okdewit的答案,使用Ds库。它在后台使用了一个命名键数组,并添加了一些辅助方法(我认为与直接使用命名键数组相比没有性能提升)。 - jpenna

5

既然您在问题标题中提到了“Set对象”(即如果您需要在集合内不重复出现对象),那么请看一下SplObjectStorage(php 5.3+)。


4

如果您正在寻找一个没有重复元素的Set数据结构,似乎从PHP 7开始,SPL为Set数据结构添加了支持。


1
小小的澄清:它不是 SPL 的一部分,而是 DSSPL 是 PHP 核心的一部分,它始终被捆绑在一起,但不幸的是 DS 不是(扩展的实际成员资格并不清楚,我在 列表 中找不到它)。 - Timurib

3
您可以使用Nspl 中的Set。它支持基本的集合操作,可以接受其他集合、数组和可遍历对象作为参数:
$set = set(1, 2);

$set->add('hello');
$set[] = 'world';

$set->delete('hello');

$array = [1, 2, 3];
$intersection = $set->intersection($array);

$anotherSet = Set::fromArray([1, 2, 3]);
$difference = $set->difference($anotherSet);

$iterator = new \ArrayIterator([1, 2, 3]);
$union = $set->union($iterator);

$isSubset = $set->isSubset([1, 2, 'hello', 'world']);

$isSuperset = $set->isSuperset([1, 2]);

3

PHP的数组就像是一个有序数组和哈希查找表的混合体。你可以通过字符串索引查找任何元素,但元素也有一个定义好的顺序。


2

只需使用PHP数组即可,PHP中不存在“固定大小”数组,因此您可以放心使用它们。


3
有一个固定大小的数组,它被称为SplFixedArray。请看这里:http://php.net/manual/zh/splfixedarray.construct.php - Julian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接