【问题标题】:PHP if statement - select two different get variables?PHP if 语句 - 选择两个不同的获取变量?
【发布时间】:2011-01-27 07:41:14
【问题描述】:

下面是我的示例脚本:

<li><a <?php if ($_GET['page']=='photos' && $_GET['view']!=="projects"||!=="forsale") { echo ("href=\"#\" class=\"active\""); } else { echo ("href=\"/?page=photos\""); } ?>>Photos</a></li>
<li><a <?php if ($_GET['view']=='projects') { echo ("href=\"#\" class=\"active\""); } else { echo ("href=\"/?page=photos&view=projects\""); } ?>>Projects</a></li>
<li><a <?php if ($_GET['view']=='forsale') { echo ("href=\"#\" class=\"active\""); } else { echo ("href=\"/?page=photos&view=forsale\""); } ?>>For Sale</a></li>

我希望 PHP 仅在它不在两个页面上时才回显 "href="#" class="active"

?page=photos&view=forsale

?page=photos&view=projects

这个我也试过了,还是不行:

<li><a <?php if ($_GET['page']=='photos' && ($_GET['view']!=='projects' || $_GET['view']!=='forsale')) { echo ("href=\"#\" class=\"active\""); } else { echo ("href=\"/?page=photos\""); } ?>>Photos</a></li>

【问题讨论】:

    标签: php if-statement


    【解决方案1】:

    你不能这样做:

    if ($var !== 'a' || !== 'b') ...
    

    你必须这样做:

    if ($var !== 'a' || $var !== 'b') ...
    

    如果您想清理该代码,我建议:

    function active_view($content, $url, $view) {
      if ($_GET['view'] == $view) {
        return link($content, '#', 'active');
      } else {
        return link($content, $url);
      }
    }
    
    function active_page_view() {
      $args = func_get_args();
      $content = array_shift($args);
      $url = array_shift($args);
      $page = array_shift($args);
      if ($_GET['page'] == $page && !in_array($view, $args)) {
        return link($content, '#', 'active');
      } else {
        return link($content, $url);
      }
    }
    
    function link($content, $href, $class) {
      $ret = '<a href="' . $href . '"';
      if ($class) {
        $ret .= ' class="' . $class . '"';
      }
      $ret .= '>' . $content . '</a>';
      return $ret;
    }
    

    然后你的代码变成:

    <li><?php echo active_page_view('Photos', '/?page=photos', 'photos', 'projects', 'forsale'); ?></li>
    <li><?php echo active_view('Projects', '/?page=photos&view=projects', 'projects'); ?></li>
    <li><?php echo active_view('For Sale', '/?page=photos&view=forsale', 'project'); ?></li>
    

    以上内容是说明性的,而不是最终和完整的。我要说明的一点是,即使您不使用模板库(例如 Smarty),您也希望养成使用某种模板机制的习惯。您很少希望将复杂的逻辑嵌入到基本上是视图的内容中。如果您使用函数(或对象)库来创建标记,它可以为您提供很多控制来转义特殊字符、自动输入属性、验证您输入的内容等等。

    在此示例中,您可能希望有一个数据结构来表示您的网站导航,您可以在其中输入当前页面的内容,并在动态构建导航时将其与所有条目进行比较并自动操作链接。

    【讨论】:

      【解决方案2】:

      除了 cletus 指出的问题之外,您还遇到了precedence of the operators 的问题。 && 的优先级高于 ||。因此

      if (
        $_GET['page']=='photos'
        && $_GET['view']!=="projects"
        || $_GET['view']!=="forsale"
      )
      

      等价于

      if (
        ( $_GET['page']=='photos' && $_GET['view']!=="projects" )
        || $_GET['view']!=="forsale"
      )
      

      但你显然想要

      if (
        $_GET['page']=='photos'
        && ( $_GET['view']!=="projects" || $_GET['view']!=="forsale" )
      )
      

      也许不是两种选择,但如果您有更多选择,您可能需要考虑使用 !in_array()。例如

      if (
        'photos'=$_GET['page']
        && !in_array($_GET['view'], array("projects","forsale"))
      )
      

      【讨论】:

        【解决方案3】:

        if($_GET['page'] == '照片' && ($view =='projects' || $view == 'forsale'))
        {
        echo '

      • 照片
      • ';
        }
        否则
        {
        echo '
      • 照片
      • ';
        } ?>

        【讨论】:

          【解决方案4】:
          if( $_GET[ 'page' ] != "photos" && $_GET[ 'view' ] != "forsale") {
             ...
          } 
          else if( $_GET[ 'page' ] != "photos" && $_GET[ 'view' ] != "projects") {
              ...
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-07-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-02-20
            • 1970-01-01
            相关资源
            最近更新 更多