2011-07-04 141 views
1

做這些聲明意味着同樣的事情?三元操作符語法

(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"; 
    } 
} 

或者我有不正確的語法嗎?

+4

三元運算符**不是IF **的替換或「簡短形式」,就像'*'運算符不能代替'+' – zerkms

+0

我還沒有仔細觀察三元運算符的正確性,但從一般觀點來看,三元表達式乍看之下比if-else代碼塊更難以理解......這種證明本身就證明了這一點。 – 2011-07-04 01:38:25

+0

不能同意@zerkms – jerluc

回答

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

你有語法不正確。三元運算符僅用於在左側分配一個值。據我所知(並樂意被證明是錯誤的),你不能把它作爲你試圖做分配兩個值。

// 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

「你不能用它來分配兩個值,因爲你試圖做」---'list($ a,$ b)= true? array(1,2):array(3,4);';-)(只是一個笑話** !!!不適合生產使用!!! **) – zerkms

+0

@zerkms認真 - 儘管很難讀。期望在Perl中看到這樣的東西! –

2

可能,但第二個版本是清晰。我不想維護第一個代碼,即使它工作。

1

這就是所謂的三元運算符,因爲它有三個操作數 - 一個條件,真正的結果,虛假的結果。

如果這聽起來像一個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

我覺得判斷這個最好的辦法就是讓編譯器決定。在C#中,這就是你得到的。編譯時錯誤;不,您不能在三元運算符的真實部分或虛假部分內使用運算符(或寫入多個語句)。 enter image description here