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

时间:2014-08-05 14:35:09

标签: 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
    }
?>

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

1 个答案:

答案 0 :(得分:7)

if ("$page_id" !== '2' || "$page_id" !== '8')

总有一些东西总是不等于&#39; 2&#39;或者&#39; 8&#39;,所以我希望你的意思是:

if ("$page_id" !== '2' && "$page_id" !== '8')

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

if (! ("$page_id" == '2' || "$page_id" == '8') )

注意,==并不严格,!==是。{1}}。正确的对应方是===,所以如果你更喜欢严格的比较,那么整个陈述就会变成:

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
}

但实际上,最后的其他人说&#39;对于其他一切&#39; ,虽然因为第一个条件(!)的不平等,第一个感觉就像一切其他。所以最好重写如下(路径交换):

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
}

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

最后,有些人可能会发现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;
}