sıradışı üçlü operasyon

7 Cevap php

Ben üçlü operatör kullanımı, bu işlemi gerçekleştirmek için istendi:

$test='one';

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

Iki yazdırır (php kullanarak işaretli).

Ben hala bu mantık hakkında emin değilim. , Kimse bana bunun için mantığı söyleyebilir Lütfen.

7 Cevap

Peki,? ve: eşit önceliğe sahiptir, bu yüzden PHP sırayla her bit değerlendirerek sağa ayrıştırma olacak:

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

İlk $test == 'one' true döndürür, böylece ilk Pars 'one değere sahiptir. Şimdi ikinci üçlü şöyle değerlendirilir:

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

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

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

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

yorumlanır

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

And the expression in paratheses evaluates to true, since both 'one' and 'two' are not null/o/other form of false. So if it would look like:

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

Bu üç basacaktır. Tamam iş yapmak için, üçlü operatörler birleştirerek unutun, ve daha karmaşık mantık için düzenli IFS / anahtarını kullanın, ya da en azından mantığını anlamak için tercüman, parantez kullanın ve standart LTR şekilde kontrol yapmak gerekir:

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...
}

Eğer parantez kullanmak zaman düzgün çalışır:

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

Ben bunu 100% anlamıyorum ama parantez olmadan, tercüman, deyim bu gibi bakmak gerekir:

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

birinci durumun doğal bir sonucu, bütün üçlü işlemin sonucu olarak döndürülecek gibi.

Ben böyle değerlendirilir olduğunu düşünüyorum:

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

($ Test == 'tek' bir ':? $ Test ==' iki ') non-zero/null, yani' iki 'mantıksal çıktı

Eğer düzgün çalışmak istiyorsanız, yazmak:

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

PHP'S documentation diyor ki:

Note: önerilir size avoid "stacking" ternary expressions. Tek bir deyim içinde birden fazla üçlü operatörü kullanarak PHP'nin davranışı olmayan açıktır:

Örnek 3 belirgin olmayan Üçlü 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ış deyimi etrafında parantez koyarsanız, o yazdırır one:

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

Eğer gerçekten var ve bu yüzden üçlü operatörler görünüm sırasına göre yürütülür:

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

İç içe üçlü işlemleri brüt! Yukarıdaki açıklama neden gösterir.

Temelde bu mantık:

is $test == 'one'

  if TRUE then echo 'one'

  else is $test == 'two'

      if TRUE then echo 'two'

      else echo three