写程序时,if语句随处可见。
有时,我们写if语句时,只知道在A条件下要做B动作,不然就做C动作。我们会如下写:
if( A ){ do B; }else{ do C; }
此种情况,我们并无需思考else对应的条件逻辑是什么。
当A条件很简单时,例如就一个表达式时,例如判断一个变量是否等于某个值:$a == 3,这种情况只要大脑没进水,就知道else走的是$a变量不等于3的逻辑。
但本文翟码农要分享的是,当A条件很复杂时,在else里要继续做if判断(即涉及到嵌套if了),该如何理清else对应的逻辑。
例如,当A条件为(Ea && Eb ) || Ec )时, 该如何确定else对应的逻辑?这里Ea,Eb,Ec代表3个判断条件。
有时候头脑清醒,你可能还能想清楚。但疲累异常时,你很可能就实在想不清楚,到底哪些情况,会走else语句块。
方法就是:利用集合思想。
上面的(Ea && Eb ) || Ec )条件表达式,我们可以转为(Ea ∩ Eb) U Ec这样的集合表达式。如此一来,else走的逻辑就是:^( (Ea ∩ Eb) U Ec )。
集合求反的顶部上划线不会弄,暂时我就用求反符号表示啦
接下来要做的工作,就是将^( (Ea ∩ Eb) U Ec )这个条件表达式展开了,这就涉及到集合的德摩根律啦。(关于德摩根律公式可见本文末尾的图片)
展开过程:
1. 先将Ea ∩ Eb看成一个整体Ed,即^( Ed U Ec ),展开就是^Ed ∩ ^Ec.
2.再将^Ed部分展开,^(Ea ∩ Eb ),展开就是^Ea U ^Eb.
3.最终结果就是( ^Ea U ^Eb) ∩ ^Ec。
将最终结果再转换成php表达式,就是 (!Ea || !Eb) && !Ec了。
随便举个php例子,仅供参考:
if( ( !empty($flag) && in_array($id, [10,12,14,18]) ) || 1 !== $value ){ $status = 0; }else{ ... }
如果要在else里语句块还要继续判断,就必须先把else对应的条件理清。
根据上面“展开过程”的分析,可知else走的逻辑是:
( empty($flag) || ! in_array($id, [10,12,14,18]) ) && 1 == $value
然后else里的逻辑,你就可以根据需求继续if判断,例如:
$status = 1; if( empty($flag) ){ $status = 2; } if( $id > 0 && $id < 9){ $status = 3 }
集合的德摩根律:
本文为翟码农个人博客蓝翟红尘里有关if语句和集合相关联分析的原创文章,转载请注明出处:http://www.zhai14.com/blog/how-to-get-the-expression-of-else-according-to-the-if-condition.html