【问题标题】:Using nested ternary operators [duplicate]使用嵌套三元运算符[重复]
【发布时间】:2012-02-02 20:25:36
【问题描述】:

我一直在尝试以嵌套形式使用isset(),如下所示:

isset($_POST['selectedTemplate'])?$_POST['selectedTemplate']:isset($_GET['selectedTemplate'])?$_GET['selectedTemplate']:0

但我似乎遗漏了一些东西。谁能帮我怎么做?

【问题讨论】:

  • 请不要使用单行。不可读。
  • 真的不推荐嵌套三元运算符,因为它完全不直观:如果你需要嵌套,你真的应该使用完整的 if/else 语法,因为它更容易为你自己和阅读其他
  • 这包含了为什么您的表单首先可以通过 POST 和 GET 提交的问题。 HTTP verbs have certain semantics to them..

标签: php


【解决方案1】:

用括号括起来:

$selectedTemplate = isset($_POST['selectedTemplate'])
                  ? $_POST['selectedTemplate']
                  : (
                       isset($_GET['selectedTemplate'])
                       ? $_GET['selectedTemplate']
                       : 0
                  );

或者更好的是,使用正确的if/else 语句(为了可维护性):

$selectTemplate = 0;

if (isset($_POST['selectedTemplate'])) {
    $selectTemplate = $_POST['selectedTemplate'];
} elseif (isset($_GET['selectedTemplate'])) {
    $selectTemplate = $_GET['selectedTemplate'];
}

但是,正如其他人指出的那样:您使用$_REQUEST 会更容易:

$selectedTemplate = isset($_REQUEST['selectedTemplate'])
                  ? $_REQUEST['selectedTemplate']
                  : 0;

【讨论】:

  • 请注意:$_REQUEST$_POST$_GET 需要更多,并且顺序可能会有所不同。
  • 干杯。正是我需要的,我不知道您必须将语句的整个第二部分括在括号中。
  • 良好的可维护性。
  • C/C++ 不需要括号来嵌套 ?:, stackoverflow.com/q/18237432/2097284,所以从那里开始接触 PHP 的人会大吃一惊。
  • @CamilleGoudeseune - C/C++ 默认对三元表达式使用右关联,而 PHP 默认使用左关联。实际上,左关联性几乎从来都不是您想要的,因此 PHP 的默认设置并没有多大意义。其实this is being deprecated in PHP 7.4.
【解决方案2】:

截至PHP 7,我们可以使用Null coalescing operator

$selectedTemplate = $_POST['selectedTemplate'] ?? $_GET['selectedTemplate'] ?? 0;

【讨论】:

    【解决方案3】:

    在这里稍微调查一下,我想,我找到了真正的答案:)

    示例代码:

    <?php
    
    $test = array();
    $test['a'] = "value";
    
    
    var_dump(
        isset($test['a'])
            ? $test['a']
            : isset($test['b'])
                ? $test['b']
                : "default"
    );
    

    注意圆括号,我已经放了。

    我猜,你正在等待类似的行为:

    var_dump(
        isset($test['a'])
            ? $test['a']
            : (isset($test['b'])  // <--  here
                ? $test['b']
                : "default")      // <--  and here
    );
    

    但是!真实的行为是这样的:

    var_dump(
        (isset($test['a'])        // <--  here
            ? $test['a']
            : isset($test['b']))  // <--  and here
                ? $test['b']
                : "default"
    );
    

    一般错误是,您错过了通知:未定义索引

    Online shell.

    【讨论】:

      【解决方案4】:

      如果我们用下面的方式写三进制,阅读起来会更简单:

      $myvar = ($x == $y)
        ?(($x == $z)?'both':'foo')
        :(($x == $z)?'bar':'none');
      

      但是三元运算符是编写简单 if 语句的简短有效方法。它们不是为嵌套而建造的。 :)

      【讨论】:

        【解决方案5】:

        使用 $_REQUEST 变量可能会更轻松:

        "$_REQUEST 是一个关联数组,默认包含 $_GET、$_POST 和 $_COOKIE 的内容。"

        http://us2.php.net/manual/en/reserved.variables.request.php

        【讨论】:

          【解决方案6】:

          我相信这会奏效:

          $test = array();
          $test['a'] = 123;
          $test['b'] = NULL;
          
          
          $var = (isset($test['a']) ? $test['a'] : (!isnull($test['b']) ? $test['b'] : "default"));
          
          echo $var;
          

          【讨论】:

            【解决方案7】:

            您可以只使用$_REQUEST 而不是繁琐的 $_GET 和 $_POST 探测,而不是具有模糊优先级的三元:

             isset($_REQUEST['selectedTemplate']) ? $_REQUEST['selectedTemplate'] : 0
            

            这正是它的用途。

            【讨论】:

              猜你喜欢
              • 2011-10-29
              • 2011-09-07
              • 2018-07-02
              • 1970-01-01
              • 1970-01-01
              • 2014-11-03
              相关资源
              最近更新 更多