2010-07-15 148 views
2

我正在查看是否可以用一個三元運算符設置多個變量。我谷歌了一下,但沒有拿出任何東西。我開始測試一些想法,發現了一些近似的東西 - 但也得到了一些奇怪的行爲;關於發生什麼事的任何想法?而且,是否可以在單個三元操作中設置多個var?如果是這樣,是否有適當的方法來做到這一點?是否可以使用一個三元運算符設置多個變量?

$i=9; 
($i==9)?($w=3|$r=2):($w=7|$r=1); 
echo 'w= '.$w.' r= '.$r;//w= 3 r= 2 


$i=9; 
($i==9)?($w=4|$r=2):($w=7|$r=1); 
echo 'w= '.$w.' r= '.$r;//w= 6 r= 2 


$i=9; 
($i==9)?($w=3|$r=7):($w=7|$r=1); 
echo 'w= '.$w.' r= '.$r;//w= 7 r= 7 


$i=444; 
($i==9)?($w=4|$r=2):($w=7|$r=1); 
echo 'w= '.$w.' r= '.$r;//w= 7 r= 1 


$i=444; 
($i==9)?($w=4|$r=2):($w=1|$r=1); 
echo 'w= '.$w.' r= '.$r;//w= 1 r= 1 

謝謝...


編輯:

我做了一點更多的測試,發現這個工作正常:

($i==9)?($w=4 AND $r=7):($w=7 AND $r=1); 
然而

,我不知道這是否正確。我很好奇第一個例子中發生了什麼。

回答

7

由於查德威克解釋,使用ANDOR邏輯運算符將無法正常工作,你希望他們的方式:

$i = 0; $w = 0; $r = 0; 
($i==9) ? ($w=4 AND $r=7) : ($w=7 AND $r=1); 
echo "w = $w, r = $r\n"; 
// w = 7, r = 1 

$i = 0; $w = 0; $r = 0; 
($i==9) ? ($w=0 AND $r=7) : ($w=0 AND $r=1); 
echo "w = $w, r = $r\n"; 
// w = 0, r = 0 

但是,如果你真的想在一個聲明中進行多次分配,可以使用在list結構:

$i = 0; $w = 0; $r = 0; 
($i==9) ? 
    (list($w, $r) = array(4, 7)) : 
    (list($w, $r) = array(7, 1)); 
echo "w = $w, r = $r\n"; 
// w = 7, r = 1 

$i = 0; $w = 0; $r = 0; 
($i==9) ? 
    (list($w, $r) = array(0, 7)) : 
    (list($w, $r) = array(0, 1)); 
echo "w = $w, r = $r\n"; 
// w = 0, r = 1 
3

OR運算符正在縮短您在三元表達式中進行的第二次分配。所以如果第一項評估爲非零,那麼第二項任務就沒有做出。

如果切換到一個AND statment(或&&)在表達所述第二分配仍然依賴於所述第一:如果所述第一計算結果爲0(即假),則的第二半部分和不進行評價。這可能比第一個調試更困難,因爲第一個值很可能是零。它可能永遠不會,並且這將始終有效......直到那一天......

三元運算符只是if...else...的簡寫形式而不是多個語句。如果你想多個,獨立作業我強烈建議去與標準如果...其他...更容易閱讀四周。

0

你缺少一個豎線,形成一個OR條款:

($i==9)?($w=3|$r=2):($w=7|$r=1); 

它應該是:

($i == 9) ? ($w = 3 || $r = 2) : ($w = 7 || $r = 1); 

而且是可以看出你有一個以上的變量$w$r使用那裏。

3

,我要嘗試一個解釋爲什麼當前的代碼行爲就像它的行爲。 首先要知道的是:|是按位運算符。第二件事要知道:|=有更高的算子優先級,因此首先執行。

因此,讓我們來看看第一個代碼:$w=3|$r=2。根據運營商的優先級,此代碼可以這樣寫:$w=(3|$r=2)。因此$r get的設置正確,然後執行$w=3|2。雙系統中的311210

11 
| 10 
==== 
    11 

所以結果是正確的。

現在,讓我們來看看第二代碼:

$w=4|$r=2是一樣$w=(4|$r=2)$r設置正確,則執行$w=4|24100在雙系統,2010

100 
| 010 
===== 
    110 

而且110在十進制系統爲6

所以,現在你知道有錯誤的值從何而來,現在讓我們找到一個解決方案:

使用&&這裏氣餒,因爲如果第一個值設置爲0第二不會在所有設置。此外,它的運算符優先級錯誤:$w=1&&$r=2$w=(1&&$r=2)相同。所以$w總是會被分配truefalse

一種可能的解決方案是使用xor運算符。此操作需要將執行雙方,並具有完善的precendance:

$i == 9 ? ($w = 1 xor $r = 2) : ($w = 2 xor $r = 3); 

但是,你可以想像,這是難以閱讀,所以最好不要使用它...

+0

+1感謝優秀的解釋。我讀到,單管是一個按位運算符,但不知道它做了什麼。有趣的東西。再次感謝! – stormdrain 2010-07-15 21:37:02

+0

+1可以很好地解釋問題。 – Mike 2010-07-15 21:52:40

相關問題