许多语言都有一个“集合”数据结构,它通常只包含来自特定对象集合的唯一值。例如,如果将整数 1、4、5、1、2 和 6 添加到集合中,最终该集合实际上只包含 1、4、5、2 和 6。
我没有在 PHP 中观察到任何这样的集合。语言中是否有这样的集合,或者是否需要自定义滚动?
我没有注意到 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
如果您碰巧需要它们,调用只是为您提供唯一值。
怀疑有什么内置的,但实现起来很简单:
<?
$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.
没有像这样的集合是 PHP 核心的一部分。您可以通过使用数组键或使用SplObjectStorage
.
在过去,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])
等