2

许多语言都有一个“集合”数据结构,它通常只包含来自特定对象集合的唯一值。例如,如果将整数 1、4、5、1、2 和 6 添加到集合中,最终该集合实际上只包含 1、4、5、2 和 6。

我没有在 PHP 中观察到任何这样的集合。语言中是否有这样的集合,或者是否需要自定义滚动?

4

4 回答 4

2

我没有注意到 PHP 语言中有任何类型的“Set”集合,所以我推出了自己的方法来模拟集合。我接近一个像哈希表一样的集合。默认情况下,哈希表中的键属于一个集合。你可以利用它来发挥你的优势。

例如,假设我有一个随机生成的整数数组$random_integers。以下将产生包含在中的唯一值数组$random_integers

$random = array(1,1,1,3,4,5,3,45,7);
$set = array();

foreach($random as $key => $value) {
  $set[$value] = 1;
}

$set = array_keys($set);

print_r($random);
print_r($set);

array_keys是 PHP 中包含的一个函数。您可以使用它从哈希表中提取所有键,这相当于一个集合。

这里的一个陷阱是只有整数和字符串可以用作数组键。因此,如果您希望将它们包含在您的集合中,您正在使用的任何对象都需要某种字符串或整数表示。

另请注意,在我的示例中,您不需要采取额外的步骤来提取数组键。 $set已经是一套了。array_keys如果您碰巧需要它们,调用只是为您提供唯一值。

于 2012-12-06T22:45:10.760 回答
1

怀疑有什么内置的,但实现起来很简单:

<?

$set = array(1, 4, 5, 1, 2, 6); // original set
$set = array_unique($set);
//$set = array_values($set); // add this to reset the keys
print_r($set); // returns 1, 4, 5, 2 and 6.
于 2012-12-06T22:54:21.770 回答
1

没有像这样的集合是 PHP 核心的一部分。您可以通过使用数组键或使用SplObjectStorage.

于 2012-12-06T22:56:37.660 回答
0

在过去,Turbo Pascal 支持 SET 类型来存储最大 255 的值。使用的机制非常简单,使用 32 字节的数组,集合中的每个值都存储在 32*8=256 位中的一个中这个数组。值 0 存储在数组 [0] 的位 0 中,值 1 存储在数组 [0] 的位 1 中。值 255 存储在数组 [31] 的位 7 中:

定位值字节和位:

BYTEPOS = $value >> 3     (0..7 => 0, 8..15 => 1 etc)
BITPOS  = $value & 7      (0,8,16 ... => bit 0  1,9,17 => bit 1 etc)

空集[0..255];

$theSET = array( 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 );

添加一个值:

$theSET[ $value >> 3 ] = $theSET [ $value >> 3 ] | (1 << ($value & 7)); 

删除:

$theSET[ $value >> 3 ] = $theSET [ $value >> 3 ] & ~(1 << ($value & 7)); 

检查:

inSET = ($theSET [ $value >> 3 ] & (1 << ($value & 7)) == (1 << ($value & 7)); 

两个集合上的操作可以作为迭代来完成,

结合:

$SetA[$i] = $SetA[$i] | $SetB[$i]

只有不在 SetB 中的值:

$SetA[$i] = $SetA[$i] & (~$SetB[$i])

于 2014-04-02T09:50:46.880 回答