您似乎对这里的组合学感到困惑。
如果你只检查一些固定数量的字符串是否为空n,不管是哪个,这将是一个组合,并且会有 C( 4,n) 个感兴趣的案例。
如果您对哪些是空的,但只有其中 n 个是空的感兴趣,那将是一个排列,并且会有 P(4 ,n) 个感兴趣的案例。
但您似乎对哪些是空的,不管有多少感兴趣。那是笛卡尔积,你需要 2^4=16 例。
当你想枚举这样的东西时,可以把它想象成对一个四位数的二进制数进行计数,其中每个数字代表一个变量(按顺序),1表示它不为空:
- 0000
- 0001
- 0010
- 0011
- 0100
- 等
因此,对这些可能性的蛮力线性搜索类似于
//0000
if (($one == '') && ($two == '') && ($three == '') && ($four == '')) {
//some action
}
//0001
else if (($one == '') && ($two == '') && ($three == '') && ($four != '')) {
// some action
}
//0010
else if (($one == '') && ($two == '') && ($three != '') && ($four == '')) {
// some action
}
//0011
else if (($one == '') && ($two == '') && ($three != '') && ($four != '')) {
// some action
}
...
但是,由于您本质上是在查看一系列布尔决策,因此我建议使用二叉搜索树。这将是一些不太漂亮的代码,但它是搜索此类内容的最有效方法(它将使用 log_2(16)=4 if 语句,而不是 16 条 - 并且没有逻辑 && 来处理)。
//Is $one empty?
if ($one == '') {
//Yes, $one is empty. Is $two empty?
if ($two == '') {
//Yes, $two is empty. Is $three empty?
if ($three == '') {
//Yes, $three is empty. Is $four empty?
if ($four == '') {
//Yes, $four is empty. The case is 0000
} else {
//No, $four is not empty. The case is 0001
}
} else {
//No, $three is not empty. Is $four empty?
if ($four == '') {
//Yes, $four is empty. The case is 0010
} else {
//No, $four is not empty. The case is 0011
}
}
} else
//No, $two is not empty. Is $three empty?
if ($three == '') {
...
现在,这段代码非常高效,但也非常冗长。如果其中任何一种情况的行为方式相同,我建议尝试找到一些其他逻辑层次结构,这些层次结构将在尽可能少的步骤中决定不同的行为——但无论如何我建议一个逻辑的层次结构 而不是您尝试的线性枚举。祝你好运!
编辑:
潜伏者的建议
$n = ($one == '' ? 0 : 1) + ($two == '' ? 0 : 2) + ($three == '' ? 0 : 4) + ($four == '' ? 0 : 8)
后跟switch 声明是一个比我上面的更清洁的解决方案。我想指出,底层逻辑是完全一样的;这行代码实际上是在构建我上面描述的二进制数,但是是以 10 为底的。希望你能看到我的答案和 Lurker 的对应关系,也希望我的回答能帮助你理解为什么 Lurker 的优越代码有效。