PHP 中布尔值的所有组合
all combinations of boolean values in PHP
与 和该类型的其他各种问题相关。
我在数据库中有一堆切换开关,想获得所有可能设置的列表。 开关的数量可以改变,具体来说,用户可以添加或删除。
我可以将它们放入数组中,例如
$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),
...
);
我并不特别关心结果集的顺序。
生成它的优雅方法是什么?
不知道它是否优雅,但例如将 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);
我会去或使用整数的二进制表示的想法(使用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
可以 return 字符串少于 2^$n
所以我反转字符串并使用 array-pad
填充 0
请注意,这将生成包含 0
和 1
而不是 true
和 false
的数组,但在 PHP 中它们非常相似 - 无论如何,交换他们的真假很容易,所以我留给你...
与
我在数据库中有一堆切换开关,想获得所有可能设置的列表。 开关的数量可以改变,具体来说,用户可以添加或删除。
我可以将它们放入数组中,例如
$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),
...
);
我并不特别关心结果集的顺序。
生成它的优雅方法是什么?
不知道它是否优雅,但例如将 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);
我会去或使用整数的二进制表示的想法(使用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
可以 return 字符串少于 2^$n
所以我反转字符串并使用 array-pad
请注意,这将生成包含 0
和 1
而不是 true
和 false
的数组,但在 PHP 中它们非常相似 - 无论如何,交换他们的真假很容易,所以我留给你...