2010-04-17 3 views
14

특이한 삼항 연산 : 두 개의 인쇄내가 삼항 연산자의 사용이 작업을 수행하도록 요청 받았다

$test='one'; 

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

는 (PHP를 사용하여 확인).

나는 이것에 대한 논리가 아직 확실하지 않습니다. 제발, 아무도 나에게 이것에 대한 논리를 말할 수 있을까?

+3

... 내 눈이 ... 불타는 내 아 .... 그것은 눈에 보이지 않는 수 없습니다 ... –

+0

그것은이다 그렇게 나쁘지 않다. 다른 언어에서는 이것이 관용구가됩니다. PHP에서 잘못 선택된 연산자 결합 덕택에 함정입니다. – bobince

+0

@bobince u는 다른 언어로 이것을 시도 했습니까? 아니면이 – nik

답변

15

음을의? 과 :

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

먼저 $test == 'one' true를 반환, 그래서 첫 번째 괄호는 '하나'값이 : PHP 차례로 각 비트를 평가 왼쪽에서 오른쪽으로 구문 분석 할 수 있도록, 같은 우선 순위가 있습니다. 이제 두 번째 원은 다음과 같이 평가 :

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

'한'은 (비어 있지 않은 문자열) 사실, 그래서 '이'는 최종 결과입니다.

+0

이것은 가장 정확한 올바른 설명입니다 :) +1. –

+0

rite가 Pekka – nik

+0

+1의 설명과 간결함을 위해 +1 (어려운 조합) –

1

PHP의 documentation는 말한다 :

참고 : 당신 피하기는 삼항 표현을 "스태킹"하는 것이 좋습니다. 하나의 구문에서 하나를 초과하는 삼항 연산자를 사용하여 PHP의 동작은 비 명백하다 :

예 # 3 명확하지 않은 삼항 행동

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

당신이 허위 진술 주위에 괄호를 넣어 경우, 그것은 인쇄 one :

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

중첩 된 삼항 연산은 총체적입니다. 위의 설명은 그 이유를 보여줍니다. 당신은 괄호를 사용하는 경우

is $test == 'one' 

    if TRUE then echo 'one' 

    else is $test == 'two' 

     if TRUE then echo 'two' 

     else echo three 
+0

나는 올바른 길을 가고 있다고 생각하지만 가장 좋은 설명을 가지고 있다고 생각한다. 'one'을 출력하지 않기 때문에 아직 더하지 않습니다. –

+0

Filix Kling의 설명은 왜 괄호가 필요한지 이해가되지 않지만 그 질문에 대답합니다. –

5

가 제대로 작동 : 인터프리터에,

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

내가 100 %하지만 괄호없이 그것을 이해하지 못하고, 문

기본적으로이 논리입니다 다음과 같이해야합니다

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

첫 번째 조건의 결과가 결과로 반환 될 것으로 보인다 전체 삼항 연산의

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

($ 테스트 == '하나' '하나': : $ 테스트 == '두') 그래서, 비 - 제로/null의 '

1

나는이 다음과 같이 평가하고 있다고 생각 두 사람은 '논리적 출력

당신이 제대로 작동하려면이며, 쓰기 :

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

은 기본적으로 인터프리터는 그래서, 왼쪽에서 오른쪽으로이 식을 계산 :

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

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

로 해석됩니다 그리고 paratheses의 표현은 모두 '하나'와 '이 있기 때문에, true로 평가 '은 null/o/다른 형태의 false가 아닙니다. 그것과 같을 것이다 그래서 만약 :

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

이 세 가지를 인쇄 할 것이다. 문제가 없도록하려면 3 진 연산자를 결합하는 것을 잊어서 더 복잡한 논리를 위해 보통 ifs/switch를 사용하거나 인터프리터가 논리를 이해하고 대괄호를 사용하고 표준 LTR 방식으로 검사를 수행하지 않아야합니다 :

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

정확하게, 나는 그것을 게시하려고했는데, PHP 문서에서 발견했습니다. :) –

1

삼항 연산자는 당신이 정말로 그래서 외관의 순서대로 실행됩니다 :

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