在PHP中使用||,OR

时间:2010-03-07 17:49:19

标签: php logical-operators

我有以下代码,重定向页面取决于$ path。

...
$path = $this->uri->segment(3);
$pathid = $this->uri->segment(4);
if($path=='forsiden'){
            redirect('','refresh');
        }elseif($path =='contact'){
            redirect('welcome/kontakt','refresh');
        }elseif($path =='illustration'){
            $this->_gallery($path,$pathid);
        }elseif($path =='webdesign'){
            redirect('welcome/webdesign','refresh');    
        }elseif($path==('web_tjenester' || 'webdesigndetails' || 
                        'vismahjemmeside' || 'joomla' || 'vismanettbutikk' || 
                        'vpasp' || 'artportfolio')){
        ...
     CODE A   
     ...    

}else{
        ...
        CODE B
        ...
                }

我用

得不到正确的结果
$path==('web_tjenester' || 'webdesigndetails' || 
'vismahjemmeside' || 'joomla' || 'vismanettbutikk' || 
'vpasp' || 'artportfolio')

联系人,插图,画廊和网页设计被重定向并正常工作。 但是所有其他页面都添加了代码A.

我期待代码A只有当$ path是web_tjenester','webdesigndetails','vismahjemmeside','joomla','vismanettbutikk','vpasp'或'artportfolio'时。

有人能指出我的错误并请你纠正我吗?

提前致谢。

- UPDATE -

以下有效,但有没有办法缩短代码?

我在重复($ path == ..)。

elseif(($path=='web_tjenester') || ($path=='webdesigndetails') || 
    ($path=='vismahjemmeside') || ($path=='joomla') || ($path=='vismanettbutikk') || 
    ($path=='vpasp') || ($path=='artportfolio')){

5 个答案:

答案 0 :(得分:5)

|| operator is a logical operator。表达式a || b的语义是,如果ab评估为 true ,则表达式 true >否则为。

所以它不能以你想要的方式使用,因为表达式('web_tjenester' || … || 'artportfolio')将被计算为布尔值(具体为: true ,因为'web_tjenester'计算结果为 true 使用boolean conversion)然后将其与$path的值进行比较。

如果要测试值是否在一组值中,可以使用数组并使用in_array测试该值:

in_array($path, array('web_tjenester', 'webdesigndetails', 'vismahjemmeside', 'joomla', 'vismanettbutikk', 'vpasp', 'artportfolio'))

答案 1 :(得分:1)

$path==('web_tjenester' || 'webdesigndetails' || 
'vismahjemmeside' || 'joomla' || 'vismanettbutikk' || 
'vpasp' || 'artportfolio')

这不是有效的语法,您需要在每个字符串前面用$path ==分隔OR。更简单的方法是将所有字符串放在一个数组中,然后使用in_array()函数进行检查。

$array = array('web_tjenester', 'webdesigndetails', 
'vismahjemmeside', 'joomla', 'vismanettbutikk',
'vpasp', 'artportfolio');
if (in_array($path, $array)) {
    // do whatever
}

答案 2 :(得分:1)

因为$path == ('x' || 'y')表示“评估'x || y',看看是否等于$ path。你需要做

if($path == 'x' || $path == 'y')

但是您可能需要考虑一个switch语句:

switch($patch) {
   case 'web_tjenester':
   case 'webdesigndetals':
          so_and_so();
          break; 
   case 'contact':
          redirect();
          break;
}

在这之前读取开关,但是:)

答案 3 :(得分:0)

你不能按照你的方式去做:你应该用$ path比较一切,所以

$path=='web_tjenester' || $path=='webdesigndetails' || 
$path=='vismahjemmeside' || $path=='joomla' || $path=='vismanettbutikk' || 
$path=='vpasp' || $path=='artportfolio'

答案 4 :(得分:0)

你不能这样做

$path==('web_tjenester' || 'webdesigndetails' || 'vismahjemmeside' || 'joomla' || 'vismanettbutikk' ||'vpasp' || 'artportfolio')

应该是

$path=='web_tjenester' || $path=='webdesigndetails' || $path=='vismahjemmeside' || $path=='joomla' ...

您可以设置阵列中使用的路径,并使用[in_array()][1]获得更清晰的代码。