2012-04-16 7 views
0

내가 이렇게 내 코드에 중첩 된 삼항 연산자를 가지고 :PHP가 중첩 된 삼항 문제

$error = $fault_all ? "ALL" : $fault_twothirds ? "TWOTHIRDS" : $fault_onethird ? "ONETHIRD" : "UNKNOWN"; 
     echo 'STATEERROR: ' . $error . ';'; 

그들은 내 우선 순위에 따라 나열하면 $ fault_all 및 $ fault_twothirds에 해당하는 경우, 내가 원하는 오른쪽 그래서 왼쪽 $ ALL에 할당 할 "ALL"; 모두가 사실이라면 똑같습니다. 모두 거짓이면 "알 수 없음"을 오류에 할당해야합니다.

그러나 그 중 하나라도 참이면 "ONETHIRD"만 반환되며 false이면 "UNKNOWN"이 반환됩니다. "ALL"및 "TWOTHIRDS"를 반환하려면 어떻게합니까?

+7

중첩 된 삼항 연산자는 디버깅에 비우호적입니다. 사용하지 마십시오. if/else/etc로 전환하십시오. – Quentin

+4

PHP는 다른 언어보다 중첩 된 삼항 연산자와 다르게 작동합니다. [여기를 참조하십시오] (http://17thdegree.com/archives/2008/01/09/php-and-nesting-ternary-operators/) –

+2

우선 순위 결정을위한 paranthesis 사용 – hjpotter92

답변

1

상태 목록을 디버그하고 관리 할 수 ​​있다는 관점에서 읽을 수없는 3 진수의 사용을 중지하고 스위치, if-elseif 문을 사용하거나 긴 목록을 예상하는 경우 같은 접근 방식은 다음과 같습니다

이 생각, 작업을해야했다
<?php 
function state($states) { 
    foreach($states as $state => $current) { 
     if($current) { 
      return $state; 
     } 
    } 
    return 'UNKNOWN'; 
} 

$states = array(
    'ALL' => $fault_all, 
    'TWOTHIRDS' => $fault_twothirds, 
    'ONETHIRD' => $fault_onethird 
); 

var_dump(state($states)); 

:

<?php 
$error = ($fault_all ? "ALL" : ($fault_twothirds ? "TWOTHIRDS" : ($fault_onethird ? "ONETHIRD" : "UNKNOWN"))); 
+0

감사합니다. 중첩 된 삼자가 작동합니다 정말로 !! 나는 괄호를 사용하여 직접 시도했지만 잘못 중첩했다. – TomaszRykala

+0

@TomaszRykala 환영합니다. –

1

다른 터너리를 서로 분리하려면 ()을 사용하거나 if/else 절을 ​​사용하는 것이 좋습니다.

+0

'switch (TRUE)'는 또한 코드 명료성을 위해 여기서도 유용 할 수 있습니다. – DaveRandom

+0

그럴 수는 없지만 될 수 있습니다. 그러나 그것은 단지 맛입니다. – Nanne

+0

공정한 부울은 스위칭 연산이 매우 유용 할 뿐이지 만 모든 연산이 'TRUE'로 평가되는 무언가를 반환 할 때 매우 유용하며, 프로 시저를 중단하고 그 중 하나가 처리 될 때 오류로 처리하려고합니다 실패하거나 그 반대의 경우. 'case :'올바르게 사용하면 매우 유용하고 강력한 구조입니다. ('goto'와 비슷합니다.) 그것의 의미를 이해하는 사람들 만 사용해야합니다. – DaveRandom

1

이것은 알려진 문제입니다. - 예를 다음과 같은 중첩 된 원에 대한 veekun

테이크 ...

<?php 
$arg = 'T'; 
$vehicle = (($arg == 'B') ? 'bus' : 
      ($arg == 'A') ? 'airplane' : 
      ($arg == 'T') ? 'train' : 
      ($arg == 'C') ? 'car' : 
      ($arg == 'H') ? 'horse' : 
      'feet'); 
echo $vehicle; 

인쇄

@ 베리 - langerak 사용 제어 흐름 기능을 언급 한 바와 같이 'horse' ...

{array, structure} 객체를 사용하면 훨씬 더 안정적입니다 ... IE

$vehicle = (empty($vehicle) ? 

    array(

    'B' => 'Bus', 
    'A' => 'Airplane', 
    'T' => 'Train', 
    'C' => 'Car', 
    'H' => 'Horse', 

    ): 

    NULL 
); 

$arg = 'T'; 

$vehicle = (! empty($arg) ? $vehicle[$arg] : "You have to define a vehicle type"); 

echo($vehicle);