PHP if语句有多个"不等于或"

Pow*_*ser -2 php variables if-statement

所以我有这个PHP代码块:

<?php
    if ("$page_id" !== '2' || "$page_id" !== '8'){
        $path = './images/'; // Only if $page_id !== '2 || 8'
    } else if ("$page_id" == '5' || "$page_id" == '6' || "$page_id" == '7') {
        $path = '../images/'; // Only if $page_id == '5-7'
    } else {
        $path = '/images/'; // For everything else
    }
?>
Run Code Online (Sandbox Code Playgroud)

但它似乎只使用($path = './images/';).出了什么问题?

Gol*_*rol 8

if ("$page_id" !== '2' || "$page_id" !== '8')
Run Code Online (Sandbox Code Playgroud)

有些东西总是不等于"2"或"8",所以我希望你的意思是:

if ("$page_id" !== '2' && "$page_id" !== '8')
Run Code Online (Sandbox Code Playgroud)

或者,为了使其更清晰(else至少更符合条件):

if (! ("$page_id" == '2' || "$page_id" == '8') )
Run Code Online (Sandbox Code Playgroud)

注意,这==不是严格的,!==而是.适当的对应方是===,所以如果你更喜欢严格的比较,整个陈述将成为:

if (!("$page_id" === '2' || "$page_id" === '8')){
    $path = './images/'; // Only if $page_id !== '2 || 8'
} else if ("$page_id" === '5' || "$page_id" === '6' || "$page_id" === '7') {
    $path = '../images/'; // Only if $page_id == '5-7'
} else {
    $path = '/images/'; // For everything else
}
Run Code Online (Sandbox Code Playgroud)

但实际上,最后的其他人说"为了其他一切",尽管由于第一个条件中的不平等(!),第一个感觉就像其他一切一样.所以最好重写如下(路径交换):

if ("$page_id" === '2' || "$page_id" === '8'){
    $path = '/images/'; // Only if $page_id === '2 || 8'
} else if ("$page_id" === '5' || "$page_id" === '6' || "$page_id" === '7') {
    $path = '../images/'; // Only if $page_id == '5-7'
} else {
    $path = './images/'; // For everything else
}
Run Code Online (Sandbox Code Playgroud)

这也解决了一个错误,因为正如Nitigya Kuchhal在评论中正确提到的那样,第二个分支永远不会被执行,因为例如5也将不是2或8,所以在这种情况下它将 - 不正确地 - 输入第一个分支如果.

最后,有些人可能会发现一个switch比if else树更可读的语句.它使用更多行,但正如您所看到的,您可以更轻松地阅读它,它几乎是自我记录的.但是,Switch并不严格,但我认为在这种情况下这不会是一个问题.

还要注意原始代码中存在的错误(你永远不会得到5,6或7)是固定的,现在实际上没有办法做错,除非你忘了break:).

switch ($page_id)
{
  case '2':
  case '8':
    $path = '/images/';
    break;
  case '5':
  case '6':
  case '7':
    $path = '../images/';
    break;
  default:
    $path = './images/';
    break;
}
Run Code Online (Sandbox Code Playgroud)

  • 第二个条件永远是真的.如果page_id为5,则第一个条件本身为真. (2认同)