【问题标题】:Usage of ||, OR in PHP|| 的用法,或在 PHP 中
【发布时间】:2011-01-24 17:30:09
【问题描述】:

我有以下代码,重定向页面取决于 $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')

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

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

谁能指出我的错误并纠正我?

提前致谢。

--更新--

以下是可行的,但有什么方法可以缩短代码?

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

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

【问题讨论】:

    标签: php logical-operators


    【解决方案1】:

    || operator is a logical operator。表达式 a || b 的语义是,如果 ab 的计算结果为 true 并且 false,则它的计算结果为 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'))
    

    【讨论】:

      【解决方案2】:
      $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
      }
      

      【讨论】:

      • 是的,它是有效的语法。然而,它在语义上的实际作用(又名无用)是迟钝且过于复杂的。
      【解决方案3】:

      因为$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;
      }
      

      在这样做之前请先阅读 switch :)

      【讨论】:

        【解决方案4】:

        你不能按照你的方式来做:你应该用 $path 比较所有东西,所以

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

        【讨论】:

          【解决方案5】:

          你不能这样做

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

          应该是

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

          您可以在数组中设置您正在使用的路径,并使用[in_array()][1] 获得更简洁的代码。

          【讨论】:

            猜你喜欢
            • 2011-03-30
            • 2014-07-02
            • 1970-01-01
            • 2023-03-31
            • 1970-01-01
            • 2012-03-21
            • 2010-12-29
            • 1970-01-01
            相关资源
            最近更新 更多