2010-04-17 15 views
14

sıradışı üçlü operasyon: İki yazdırırBen Üçlü operatör kullanımının bu işlemi gerçekleştirmek için istendi

$test='one'; 

echo $test == 'one' ? 'one' : $test == 'two' ? 'two' : 'three'; 

(php kullanarak işaretli).

Bunun mantığı konusunda hala emin değilim. Lütfen, bunun için bana mantığı söyleyen biri olabilir.

+3

... gözlerim ... yanıyor .... oh my o görünmeyen olamaz ... –

+0

o var hiç fena değil. Diğer dillerde bu bir deyim olurdu. PHP'de, kötü seçilmiş operatör birliği sayesinde, bu bir tuzak. – bobince

+0

@bobince bunu diğer dillerde de denediniz ya da sadece bu – nik

cevap

15

Peki,? ve:

echo ($test == 'one' ? 'one' : $test == 'two') ? 'two' : 'three'; 

İlk $test == 'one' döner doğru, bu nedenle ilk parens 'tek' bir değere sahip: PHP sırayla her bit değerlendiren soldan sağa doğru ayrıştırmak böylece eşit önceliğe sahiptir. Şimdi ikinci üçlü şöyle değerlendirilir:

'one' /*returned by first ternary*/ ? 'two' : 'three' 

'tek' (boş olmayan bir dize) doğrudur, yani 'iki' nihai sonucudur.

+0

Bu en kısa doğru açıklama :) +1. –

+0

rite, açıklama ve açıklık netliği için Pekka – nik

+0

+1 dedi (zor bir kombinasyon) –

1

PHP'S documentation diyor ki:

Not: Size önlemek üçlü ifadeleri "istifleme" önerilir. Tek bir deyimi içinde birden fazla üçlü operatörü kullanarak PHP'nin davranış olmayan açıktır:

Örnek 3. İç içe üç terimli Davranış

<?php 
// on first glance, the following appears to output 'true' 
echo (true?'true':false?'t':'f'); 

// however, the actual output of the above is 't' 
// this is because ternary expressions are evaluated from left to right 

// the following is a more obvious version of the same code as above 
echo ((true ? 'true' : false) ? 't' : 'f'); 

// here, you can see that the first expression is evaluated to 'true', which 
// in turn evaluates to (bool)true, thus returning the true branch of the 
// second ternary expression. 
?> 

Eğer yanlış ifade etrafına parantez koyarsanız, yazdırır one:

echo $test == 'one' ? 'one' : ($test == 'two' ? 'two' : 'three'); 
0

İçiçe üçlü işlemleri brüt vardır! Yukarıdaki açıklama nedenini göstermektedir. Eğer parantez kullandığınızda

is $test == 'one' 

    if TRUE then echo 'one' 

    else is $test == 'two' 

     if TRUE then echo 'two' 

     else echo three 
+0

seçebilirim. Doğru yolda olduğunuzu ve en iyi açıklamaya sahip olduğunuzu düşünüyorum. henüz eklenmiyor, çünkü "one" –

+0

çıktı Filix Kling'in bu soruya cevapları, parantezin neden gerekli olduğunu anlamamasına rağmen soruları yanıtlıyor. –

5

O düzgün çalışır: tercümana,

<? 
$test='one'; 
echo $test == 'one' ? 'one' : ($test == 'two' ? 'two' : 'three'); 

ben% 100 ama parantez olmadan bunu anlamıyorum, deyim

Temelde bu mantık Bu gibi bakmak gerekir:

echo ($test == 'one' ? 'one' : $test == 'two') ? 'two' : 'three'; 

birinci durumun sonucu sonucu olarak iade edilecek gibi görünüyor bütün üçlü operasyonun.

echo ($test == 'one' ? 'one' : $test == 'two') ? 'two' : 'three'; 

($ testi == 'bir' 'tek':? $ Testi == 'iki') böylece, sıfır olmayan/null '

1

bunun böyle değerlendirilir düşünüyorum iki' mantıksal çıkış

Eğer doğru çalışmak istiyorsanız olduğunu, yazma:

echo $test == 'one' ? 'one' : ($test == 'two' ? 'two' : 'three'); 
7

Temelde tercüman yüzden, soldan sağa bu ifadeyi değerlendirir:

echo $test == 'one' ? 'one' : $test == 'two' ? 'two' : 'three';

echo ($test == 'one' ? 'one' : $test == 'two') ? 'two' : 'three';

olarak yorumlanır Ve paratheses içinde ifade hem 'one' ve 'iki yana doğru olarak değerlendirilir 'null/o/diğer yanlış biçimi değildir. o şekilde görünecektir Yani eğer :

echo $test == 'one' ? FALSE : $test == 'two' ? 'two' : 'three';

Üç kişi basacaktır. Tamamen çalışmasını sağlamak için, üçlü operatörleri birleştirmeyi unutmamalı ve daha karmaşık mantık için düzenli ifs/switch kullanmalı veya en azından parantezleri kullanmalı, tercüman mantığınızı anlayacaktır ve standart LTR yolunda kontrol gerçekleştirmeyecektir:

echo $test == 'one' ? 'one' : ($test == 'two' ? 'two' : ($test == 'three' ? 'three' : 'four')); 

//etc... It's not the most understandable code... 

//You better use: 
if($test == 'one') 
    echo 'one'; 
else { //or elseif() 
... 
} 

//Or: 
switch($test) { 
    case 'one': 
     echo 'one'; 
     break; 
    case 'two': 
     echo 'two'; 
     break; 
//and so on... 
} 
+0

Tam olarak, ben onu yüklemek üzereydim, php belgelerinde buldum. :) –

1

Üçlü operatörler gerçekten var bu yüzden görünüm sırasıyla yürütülür:

echo ($test == 'one' ? 'one' : $test == 'two') ? 'two' : 'three';