一维数组的所有可能组合而不重复,请颠倒顺序

时间:2019-07-09 16:14:14

标签: php arrays

有问题,我要检查很多组合(要缓存用户可以发出的一些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的所有组合)

我希望我很清楚, 谢谢您的帮助

0 个答案:

没有答案