使用嵌套的三元运算符

时间:2012-01-04 22:52:59

标签: php

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

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

但似乎我错过了一些东西。谁能帮助我怎么做?

7 个答案:

答案 0 :(得分:43)

用括号括起来:

$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;

答案 1 :(得分:3)

您可以更简单地使用$ _REQUEST变量:

  
    

“$ _ REQUEST是一个关联数组,默认情况下包含$ _GET,$ _POST和$ _COOKIE的内容。”

  

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

答案 2 :(得分:3)

如果我们以下列方式编写三元数,则更容易阅读:

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

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

答案 3 :(得分: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 :(得分:3)

php 7开始,我们可以使用Null coalescing operator

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

答案 5 :(得分:1)

而不是具有模棱两可的优先级的三元组,你可以使用$_REQUEST代替fiddly $ _GET和$ _POST探测:

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

这正是它的用途。

答案 6 :(得分:1)

我相信这会奏效:

$test = array();
$test['a'] = 123;
$test['b'] = NULL;


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

echo $var;