【问题标题】:all combinations of boolean values in PHPPHP中布尔值的所有组合
【发布时间】:2019-07-27 02:19:22
【问题描述】:

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),
...
);

我并不特别关心结果集的顺序。

生成它的优雅方法是什么?

【问题讨论】:

  • 递归在这里是正确的方法。您应该能够根据此处的答案解决问题:stackoverflow.com/questions/21556945/…
  • 到目前为止,您尝试什么了吗?就个人而言,我会计算开关,从 0 迭代到 ^2n-1 并将整数的位映射到开关。
  • @FranzGleichmann 这正是我在回答中提供的:)
  • @FranzGleichmann 是的,我尝试了一种不太成功的简单递归方法。
  • @dWinder 快速检查了一下,它似乎有效,但最后我选择了另一个答案。

标签: php arrays boolean combinations php-7


【解决方案1】:

不知道它是否优雅,但例如使用带有回调的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);

【讨论】:

  • 将 array_merge 替换为 + 运算符,它也适用于数字键。
【解决方案2】:

我会去或使用整数的二进制表示的想法(使用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 很容易,所以我把它留给你...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-11
    • 2012-08-21
    • 2012-09-11
    • 2018-10-19
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 2015-06-25
    相关资源
    最近更新 更多