在 PHP 中查找数组的子集
我有一个带有属性(ABCD)的关系模式。 我也有一组功能依赖项。
现在我需要确定 R 属性的所有可能子集的闭包。这就是我被困住的地方。我需要学习如何在 PHP 中查找子集(非重复)。
我的数组是这样存储的。
$ATTRIBUTES = ('A', 'B', 'C', 'D').
所以我的子集应该是
$SUBSET = ('A', 'B', 'C', 'D', 'AB', 'AC', AD', 'BC', 'BD', 'CD', 'ABC', 'ABD', 'BCD', 'ABCD')
代码不应该很大,但由于某种原因我无法理解它。
I have a Relational Schema with attributes (A B C D).
I have a set of Functional Dependencies with me too.
Now I need to determine the closure for all the possible subsets of R's attributes. That's where I am stuck. I need to learn how to find subsets (non-repeating) in PHP.
My Array is stored like this.
$ATTRIBUTES = ('A', 'B', 'C', 'D').
so my subsets should be
$SUBSET = ('A', 'B', 'C', 'D', 'AB', 'AC', AD', 'BC', 'BD', 'CD', 'ABC', 'ABD', 'BCD', 'ABCD')
The code shouldn't be something big but for some reason I can't get my head around it.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
从 PHP 7.4 开始,我们可以通过使用 展开运算符来拥有一个不错的简短的
powerSet
函数:As of PHP 7.4, we can have a nice short
powerSet
function by using spread operator:您想要
$attributes
的幂集吗?这就是你的问题所暗示的意思。可以在此处找到示例(为了完整性而引用)
You wish for the power set of
$attributes
? That is what your question implies.An example can be found here (quoted for completeness)
这里有一个回溯解决方案。
给定一个返回输入集的所有 L 长度子集的函数,找到从 L = 2 到数据集输入长度的所有 L 长度子集
Here a backtracking solution.
given a function that returns all the L-lenght subsets of the input set, find all the L-lenght subsets from L = 2 to dataset input length
根据@Yada的回答,这将生成数组的幂集,但保留每个子集中原始数组的键(返回值仍然按数字顺序索引)。如果您需要关联数组的子集,这非常有用。
子集还保留原始数组的元素顺序。我向
$results
添加了稳定排序,因为我需要它,但您可以省略它。给定OP的输入,
var_dump(power_set(['A', 'B', 'C', 'D']));
提供:Based on @Yada's answer, this will generate the power set of an array, but preserve the original array's keys in each subset (the return value is still numerically & sequentially indexed). This very useful if you need subsets of an associative array.
The subsets also retain the element order of the original array. I added a stable sort to
$results
because I needed it, but you can omit it.Given OP's input,
var_dump(power_set(['A', 'B', 'C', 'D']));
provides:在@fbstj回答之后,我更新了函数:
sprintf
(@Titus 评论)因为幂集函数会大量增加内存负载(2count ($in) 迭代),考虑使用 生成器:
用法:
Following @fbstj answer, I update the function:
sprintf
(@Titus comments)Since power set functions can increase by a lot the memory load (2count($in) iterations), consider using Generator:
Usage: