有问题,我要检查很多组合(要缓存用户可以发出的一些SQL请求,可能有1,54.10 ^ 90种以上的可能性)。因此,我很确定PHP不能真正计算出该值,因此我想从底部开始进行所有组合。
基本上,我需要什么:数组[1、2、3]
应输出
此:
Array
(
[0] => 1
)
Array
(
[0] => 2
)
Array
(
[0] => 1
[1] => 2
)
Array
(
[0] => 3
)
Array
(
[0] => 1
[1] => 3
)
Array
(
[0] => 2
[1] => 3
)
Array
(
[0] => 1
[1] => 2
[2] => 3
)
此功能显示:
function combinations ($array) {
if (is_array($array) && sizeof($array) > 0) {
$size = count($array);
$total = pow(2, $size); // 2^n for total combinations (1 is a null combination)
for ($i = 0 ; $i < $total ; $i++) {
$comb = [];
for ($j = 0 ; $j < $size ; $j++) {
if (pow(2, $j) & $i) $comb[] = $array[$j];
}
if (is_array($comb) && sizeof($comb) > 0) yield $comb;
}
}
}
我所说的“底部”是:例如,数组[1、2、3、4、5]
有2 ^ 5个组合(为null);所以32种组合(带有空值)
有输出:
Array
(
[0] => 1
)
Array
(
[0] => 2
)
Array
(
[0] => 1
[1] => 2
)
Array
(
[0] => 3
)
Array
(
[0] => 1
[1] => 3
)
Array
(
[0] => 2
[1] => 3
)
Array
(
[0] => 1
[1] => 2
[2] => 3
)
Array
(
[0] => 4
)
Array
(
[0] => 1
[1] => 4
)
Array
(
[0] => 2
[1] => 4
)
Array
(
[0] => 1
[1] => 2
[2] => 4
)
Array
(
[0] => 3
[1] => 4
)
Array
(
[0] => 1
[1] => 3
[2] => 4
)
Array
(
[0] => 2
[1] => 3
[2] => 4
)
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
)
Array
(
[0] => 5
)
Array
(
[0] => 1
[1] => 5
)
Array
(
[0] => 2
[1] => 5
)
Array
(
[0] => 1
[1] => 2
[2] => 5
)
Array
(
[0] => 3
[1] => 5
)
Array
(
[0] => 1
[1] => 3
[2] => 5
)
Array
(
[0] => 2
[1] => 3
[2] => 5
)
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 5
)
Array
(
[0] => 4
[1] => 5
)
Array
(
[0] => 1
[1] => 4
[2] => 5
)
Array
(
[0] => 2
[1] => 4
[2] => 5
)
Array
(
[0] => 1
[1] => 2
[2] => 4
[3] => 5
)
Array
(
[0] => 3
[1] => 4
[2] => 5
)
Array
(
[0] => 1
[1] => 3
[2] => 4
[3] => 5
)
Array
(
[0] => 2
[1] => 3
[2] => 4
[3] => 5
)
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
)
我需要反转数组,当然对于这么小的数组,我可以使用array_reverse来做到,但是我有一个遍历119个元素的循环,所以2 ^ 119个元素。我试图反转“组合”功能中的循环,但是正如您可以看到的那样,它将从2 ^ 119变为0,而PHP无法做到这一点,或者它花费的时间太长。
我希望能够像
那样循环播放foreach (combinations([1,...,119] as $i => $comb) {
... Whatever ...
if ($i > 100) break;
}
例如。 并且能够在数组中首先拥有大个子组合。
因为在我的应用程序中,进行SQL查询,所以用户每次检查都打勾时就会进入该页面,并且大多数情况下,将不会执行数据量不大的查询。
如果您需要查看更多内容:
(示例)
我有119个城市, 我有33个科目 我有128个站点
用户可以使用某些复选框进行过滤,以删除一个网站,一个主题,一个城市等...
当用户进行过滤时,我已经缓存了SQL请求,但是我希望有一个运行每个SQL查询的脚本。
所以在我的脚本中,
我使用组合功能来组合119个城市,33个主题和128个站点的所有组合。
然后,我对这3个数组进行笛卡尔乘积运算以获取每个SQL查询。
我不得不说,我在Google上搜索了很多东西,没有什么真正的帮助我(只是此链接https://r.je/php-find-every-combination,创建了从0到2 ^ n的所有组合)
我希望我很清楚, 谢谢您的帮助