PHP中布尔值的所有组合

时间:2019-03-05 15:04:39

标签: php arrays boolean combinations php-7

Generating all the combinations of a set of boolean variables in Haskell和其他类型的问题有关。

我在数据库中有一堆拨动开关,并且想要获取所有可能设置的列表。 开关数量可以更改,特别是用户可以添加或删除。

我可以将它们放入类似的数组中

$switches = array('aaa', 'bbb', 'ccc');

,我想产生所有可能性,例如:

$states = array(
array('aaa' => false, 'bbb' => false, 'ccc' => false),
array('aaa' => false, 'bbb' => false, 'ccc' => true),
array('aaa' => false, 'bbb' => true, 'ccc' => false),
array('aaa' => false, 'bbb' => true, 'ccc' => true),
...
);

我并不特别在乎结果集的顺序。

什么是优雅的生成方式?

2 个答案:

答案 0 :(得分:1)

Dunno(如果很优雅),但是例如使用array_reduce进行回调:

$a = ['a', 'b', 'c'];
$states = array_reduce($a, function ($t, $v) {
    $newt = [];
    if (empty($t)) {
        $newt = [
            [$v => false],
            [$v => true],
        ];
    } else {
        foreach ($t as $item) {
            $newt[] = array_merge($item, [$v => false]);
            $newt[] = array_merge($item, [$v => true]);
        }
    }

    return $newt;
}, []);
var_dump($states);

答案 1 :(得分:0)

我可能会想到使用整数的二进制表示形式(使用decbin):

$keys = ["aaa", "bbb", "ccc"];
$n = count($keys);
for($i = 0; $i < pow(2,$n); $i++) {
    $num = array_reverse(str_split(decbin($i)));
    $res[] = array_pad($num, $n, 0);   
}

foreach($res as &$e) // adding the keys to the result
    $e = array_combine($keys, $e);

请注意,decbin返回的字符串少于2^$n,所以我使用array-pad反转了字符串并以0填充

请注意,这将使用01而不是truefalse生成数组,但是在PHP中它们非常相似-无论如何,将它们交换为true和false是很容易,所以我留给你...