三元运算符语法

时间:2011-07-04 01:33:17

标签: php syntax ternary-operator

这些陈述是否意味着同样的事情?

(empty($order)) ? $orderBy="ASC" && $order="down" : (($order=="up") ? $orderBy="ASC" && $order="down" : $orderBy="DESC" && $order="up");

if (empty($order)) {
    $orderBy="ASC";
    $order="down";
}
else {
    if ($order=="up") {
        $orderBy="ASC";
        $order="down";
    }
    elseif ($order=="down") {
    $orderBy="DESC";
    $order="up";
    }
}

或者我的语法不正确?

5 个答案:

答案 0 :(得分:3)

您的语法不正确。三元运算符仅用于左侧的赋值,仅用于一个值。据我所知(并且很高兴被证明是错误的)你不能像你想要的那样用它来分配两个值。

// Assign $orderBy via nested ternary:
$orderBy = (empty($order)) ? "ASC" : (($order=="up") ? "ASC" : "DESC");

实际上,这可以更简洁,不需要嵌套:

// Assign $orderBy via nested ternary:
$orderBy = empty($order) || $order == "up" ? "ASC" : "DESC";

// Separately, assign $order
$order = empty($order) || $order == "up" ? "down" : "up";

答案 1 :(得分:2)

可能,但第二个版本很多更清晰。我不想像第一个那样维护代码,即使它确实有效。

答案 2 :(得分:2)

我认为这将有助于通过声明来解决这个问题。

//if empty($order)
(empty($order)) ? 
    // orderBy = ASC && order = down means if( ASC ) order = down
    // since non-empty strings evaluate to true, then empty(order) => orderBy = ASC and order = down
    $orderBy="ASC" && $order="down" : 
    // else (order is not empty) if order = up
    (($order=="up") ? 
        // see above what logic is evaluated here.
        $orderBy="ASC" && $order="down" : 
        // order is not empty and it is not = up
        // orderBy = DESC & order = UP
        $orderBy="DESC" && $order="up");

由于所有这些不同子句的性质,整个块将返回“TRUE”到空(order)前面的任何内容。

更清洁,更明显:

if( empty( $order ) || $order == 'up' )
{
    $orderBy='ASC';
    $order='down';
}
else 
/* NOTE: No down referenced in original use 'elseif( $order == 'down' ) */
{
    $orderBy='DESC';
    $order='up';
}

至少,它会减少对其他人的打扰,老实说,这是一个非常好的政策。

哦,顺便说一下,这个:

if (empty($order)) {
    $orderBy="ASC";
    $order="down";
}
else {
    if ($order=="up") {
        $orderBy="ASC";
        $order="down";
    }
    elseif ($order=="down") {
    $orderBy="DESC";
    $order="up";
    }
}

变为:

(empty($order) || $order == 'up')?$oderBy='ASC' && $order = 'down':($order == 'down')?$orderBy = 'DESC' && $order = 'up': /* replace with your default */ FALSE;

但这会让人 ANGRY

答案 3 :(得分:1)

它被称为三元运算符,因为它需要三个操作数 - 一个条件,一个结果为true,一个结果为false。

如果这听起来像是对你的if声明,你就是对的钱 - 三元运算符是做if语句的简写(虽然很难阅读)。

最简单的例子:

// Using the ternary operator
<?php
    $agestr = ($age < 16) ? 'child' : 'adult';
?>

// Using the if statement
<?php
   if ($age < 16) {
        $agestr = 'child';
    } else {
        $agestr = 'adult';
    }
?>

答案 4 :(得分:0)

我认为判断这个的最好方法是让编译器决定。在C#中,这就是你得到的。编译时错误;不,你不能使用&amp;&amp;在三元运算符的true部分或false部分内的operator(或写多个语句)。 enter image description here