все комбинации логических значений в PHP - PullRequest
1 голос
/ 05 марта 2019

Относится к Генерация всех комбинаций набора логических переменных в 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 ]

1 голос
/ 05 марта 2019

Не знаю, если это элегантно, но, например, используйте 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);
0 голосов
/ 05 марта 2019

У меня была бы идея использовать двоичное представление целых чисел (используя 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поэтому я переворачиваю строку и pad с 0, используя array-pad

Обратите внимание, что это сгенерирует массив с 0 и 1 вместо true и false, но в PHPони очень похожи - в любом случае, обменять их на истину и ложь достаточно легко, поэтому я оставляю это вам ...

...