Синтаксис троичного оператора - PullRequest
1 голос
/ 04 июля 2011

Означают ли эти утверждения одно и то же?

(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 ]

3 голосов
/ 04 июля 2011

У вас неверный синтаксис. Тернарный оператор используется для присваивания слева только для одного значения. Насколько я знаю (и был бы рад оказаться неправым), вы не можете использовать его для назначения двух значений, которые вы пытаетесь сделать.

// 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";
2 голосов
/ 04 июля 2011

Я думаю, что это поможет пошагово выполнить это утверждение оператором.

//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");

Из-за природы всех этих различных предложений, весь этот блок возвращает «ИСТИНА» чему-либо перед пустым (порядок).

Чище и более очевидно иметь:

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;

Но это сделает людей ЗЛОЙ .

2 голосов
/ 04 июля 2011

Возможно, но вторая версия намного понятнее.Я не хотел бы поддерживать код как первый, даже если он работает.

1 голос
/ 04 июля 2011

Он называется троичным оператором, потому что он принимает три операнда - условие, результат для 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';
    }
?>
0 голосов
/ 04 июля 2011

Я думаю, что лучший способ оценить это - позволить компилятору принять решение. В C # это то, что вы получаете. Ошибка времени компиляции; Нет, вы не можете использовать оператор && (или написать несколько операторов) внутри истинной части или ложной части троичного оператора. enter image description here

...