PHP에서 "if / else"의 약어로 삼항 연산자 (? :)를 어떻게 사용합니까?


118

이 페이지 의 예제 기반으로 아래에 작동하는 코드와 작동하지 않는 코드 샘플이 있습니다.

if문을 사용하는 작업 코드 :

if (!empty($address['street2'])) echo $address['street2'].'<br />';

삼항 연산자를 사용하는 작동하지 않는 코드 :

$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

// Also tested this
(empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

업데이트
브라이언의 팁 후, 나는 에코 $test가 예상 된 결과를 출력 한다는 것을 발견했습니다 . 다음은 매력처럼 작동합니다!

echo (empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />';

4
정확 해 보입니다. $ test;를 에코하려고 했습니까?
Brian Fisher

귀하의 질문은 일부 자원 봉사자와 연구원을 속이는 것입니다. 속기 삼항 표현식을 사용하여 과제를 작성하지 않기 때문입니다 ( "Elvis 연산자"가 없음). 차이점은 평가에 따라 반환 된 값을 모두 선언한다는 것입니다. 속기 평가에서 입력 값이 "truthy"이면 반환됩니다. "거짓"이면 폴백 값이 반환됩니다 (Elvis 연산자 다음에 선언 된 값). 여기에도 Null 통합 연산자의 구현이 눈에 띄게 좋지 않습니다.
mickmackusa

답변:


234

그만큼

(condition) ? /* value to return if condition is true */ 
            : /* value to return if condition is false */ ;

구문은 ?다음과 같은 방식으로 코드를 실행할 수 없기 때문에 "약식 if"연산자 ( 조건부 연산자라고 함)가 아닙니다.

if (condition) {
    /* condition is true, do something like echo */
}
else {
    /* condition is false, do something else */
}

귀하의 예에서는이 비어 있지 않을 echo때 문을 실행하고 $address있습니다. 조건부 연산자와 같은 방식으로이 작업을 수행 할 수 없습니다. 그러나 수행 할 수있는 작업 echo은 조건부 연산자의 결과입니다.

echo empty($address['street2']) ? "Street2 is empty!" : $address['street2'];

그러면 "Street is empty!"가 표시됩니다. 비어 있으면 street2 주소를 표시합니다.


그것은 진술과 표현의 차이입니다
pmiranda

2
다시 속기는 무엇입니까? 그것이 사실인지 condition ?: false평가하는 condition것은 무엇입니까?
올드 보이

44

PHP 7 이상

PHP 7 부터이 작업은 다음 과 같이 Null 병합 연산자를 사용하여 간단히 수행 할 수 있습니다 .

echo !empty($address['street2']) ?? 'Empty';


3
$address['street2']빈 문자열 인 경우 참고하십시오 . 그것은 그것을 받아들이고 반환하지 않을 것 'Empty'입니다. isset() != empty(). 값이 다음과 같은 경우에만 작동합니다.null
AFwcxx

글쎄, 나는 단지 예를 제공하고 있었다. 하지만 코드를 수정했습니다. 감사 !
Rabin Lama Dong

2
$address['street2']비어 있지 않은 경우 출력은 무엇입니까 ?
AliN11

$ address [ 'street2']가 비어 있지 않으면 "true"형식을 출력합니다. 위의 일반적인 형식은 더 비슷합니다. echo $address['street2'] ?? 'Empty';그러나 언급했듯이 " null 병합 연산자"이므로 null 만 테스트하고 비어 있지는 않습니다. 이 때문입니다 ?? isset ()의 약어입니다.
Brian C

1
이 답변에 반대 투표하기 위해 로그인했습니다. 이것은 광고 된 내용을 전혀 수행하지 않습니다.
TKoL

28

기본 참 / 거짓 선언

$is_admin = ($user['permissions'] == 'admin' ? true : false);

조건부 환영 메시지

echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';

조건부 항목 메시지

echo 'Your cart contains '.$num_items.' item'.($num_items != 1 ? 's' : '').'.';

참조 : https://davidwalsh.name/php-ternary-examples


2
당신은 짧은 웹 사이트에서 그것을 얻었고 그것을 참조조차하지 않았습니다
Richard

1
추가 참조를 @ 리차드
아룬 Yokesh에게

맞나요? StackOverflow의 맥락에서 그것은 항상 얇은 선입니다. Q가 무언가를 요청했고, 스스로 찾을 수 없었고, 다른 누군가가이 콘텐츠를 전달했음을 의미합니다. 이 Q / A에 도움이되고 가치를 더한다면 기존 콘텐츠를 복사하는 것이 부당합니까? StackOverflow에 대한 답변은 "자신의 콘텐츠"가 아니라고 생각합니다. hmmm
Sliq

첫 번째 예는 올바르지 않습니다. 위치 )가 잘못되었습니다. 그것은 선행해야한다 ?. 완전한 성명서는$is_admin = ($user['permissions'] == 'admin') ? true : false;
1934286

12

삼항 연산자는 if / else 블록의 약어입니다. 작업 코드에는 else 조건이 없으므로 이에 적합하지 않습니다.

다음 예제가 작동합니다.

echo empty($address['street2']) ? 'empty' : 'not empty';

6

당신이 찾고있는 삼항 연산자 일명 Elvis 연산자 (google it : P)입니다.

echo $address['street2'] ?: 'Empty'; 

변수 값을 반환하거나 변수가 비어 있으면 기본값을 반환합니다.


@Structed 나는 당신이 말한 것에 동의하지 않을 수는 있지만, 인터넷 검색을 통해 적절한 결과를 얻을 수 있으며 상기시키는 것이 더 쉬운 용어입니다
Keyboard ninja

4

참고 중첩 된 조건 연산자를 사용하는 경우, 당신은 괄호를 사용할 수 있습니다 가능한 문제를 피하기 위해!

PHP가 최소한 Javascript 또는 C #과 동일한 방식으로 작동하지 않는 것 같습니다.

$score = 15;
$age = 5;

// The following will return "Exceptional"
echo 'Your score is: ' . ($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average'));

// The following will return "Horrible"
echo 'Your score is: ' . ($score > 10 ? $age > 10 ? 'Average' : 'Exceptional' : $age > 10 ? 'Horrible' : 'Average');

Javascript와 C #의 동일한 코드는 두 경우 모두 "Exceptional"을 반환합니다.

두 번째 경우, PHP가하는 일은 (또는 적어도 내가 이해하는 것입니다) :

  1. 이다 $score > 10? 예
  2. 이다 $age > 10? 아니요, 따라서 현재 $age > 10 ? 'Average' : 'Exceptional'는 '예외'를 ​​반환합니다.
  3. 그런 다음 전체 문을 중지하고 'Exceptional'을 반환하는 대신 다음 문을 계속 평가합니다.
  4. 다음 문장은 'Exceptional' ? 'Horrible' : 'Average''Exceptional'이 진실이므로 'Horrible'을 반환합니다.

문서에서 : http://php.net/manual/en/language.operators.comparison.php

삼항 표현식을 "스택"하지 않는 것이 좋습니다. 단일 명령문 내에서 둘 이상의 삼항 연산자를 사용할 때 PHP의 동작은 명확하지 않습니다.


3

빠르고 짧은 방법 :

echo $address['street2'] ? : "No";

다음은 하나 이상의 다양한 조건이있는 몇 가지 흥미로운 예입니다.

$color = "blue";

// Condition #1 Show color without specifying variable 
echo $color ? : "Undefined";
echo "<br>";

// Condition #2
echo $color ? $color : "Undefined";
echo "<br>";

// Condition #3
echo ($color) ? $color : "Undefined";
echo "<br>";

// Condition #4
echo ($color == "blue") ? $color : "Undefined";
echo "<br>";

// Condition #5
echo ($color == "" ? $color : ($color == "blue" ? $color : "Undefined"));
echo "<br>";

// Condition #6
echo ($color == "blue" ? $color : ($color == "" ? $color : ($color == "" ? $color : "Undefined")));
echo "<br>";

// Condition #7
echo ($color != "") ? ($color != "" ? ($color == "blue" ? $color : "Undefined") : "Undefined") : "Undefined";
echo "<br>";

2

조건부 환영 메시지

echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';

중첩 된 PHP 속기

echo 'Your score is:  '.($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average') );

2

당신은 대체하여도 단축 할 수 있습니다 echo<?= code ?>

<?=(empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />'?>

이것은 메뉴 옵션이 이미 방문 (클릭) 된 상태로 표시되어야하는지 여부를 탐색 모음 내에서 결정하려는 경우 특히 유용합니다.

<li<?=($basename=='index.php' ? ' class="active"' : '')?>><a href="index.php">Home</a></li>


그 <? =?> 메서드에 ()가 필요합니까?
curls

0

괄호를 잘못 사용한 것 같습니다. 이 시도:

$test = (empty($address['street2']) ? 'Yes <br />' : 'No <br />');

작동해야한다고 생각하며 다음을 사용할 수도 있습니다.

echo (empty($address['street2']) ? 'Yes <br />' : 'No <br />');

0

PHP에서 삼항 연산자를 사용해서는 안된다고 생각합니다. 다음 예를 고려하십시오.

<?php

function f1($n) {
    var_dump("first funct");
    return $n == 1;
}

function f2($n) {
    var_dump("second funct");
    return $n == 2;
}


$foo = 1;
$a = (f1($foo)) ? "uno" : (f2($foo)) ? "dos" : "tres";
print($a);

어떤 $a변수가 포함될 것이라고 생각 하십니까? (힌트 : dos) 그리고 $foo변수가 2에 할당 되더라도 동일하게 유지 됩니다.

상황을 개선하려면이 연산자 사용을 거부하거나 다음과 같은 방법으로 오른쪽 부분을 중괄호로 묶어야합니다.

$a = (f1($foo)) ? "uno" : ((f2($foo)) ? "dos" : "tres");

0

삼항 연산자는 기본적으로 if / else 문의 약자입니다. 몇 줄의 코드를 줄이고 가독성을 높이는 데 사용할 수 있습니다.

귀하의 코드는 나에게 더 깨끗해 보입니다. 그러나 다음과 같이 더 깨끗한 방법을 추가 할 수 있습니다.

$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

또 다른 방법-

$test = ((empty($address['street2'])) ? 'Yes <br />' : 'No <br />');

참고-전체 표현에 대괄호를 추가하여 깔끔하게 만들었습니다. 나는 보통 가독성을 높이기 위해 이것을 사용했습니다. PHP7로 Null Coalescing Operator / php 7 ?? 더 나은 접근을 위해 연산자 . 그러나 귀하의 요구 사항은 적합하지 않습니다.


-1

속기 삼항 연산자도 있으며 다음과 같습니다.

(expression1에) : expression2가 반환 하여 expression1 이 true 또는로 평가되면 expression2를 , 그렇지.

예:

$a = 'Apples';
echo ($a ?: 'Oranges') . ' are great!';

돌아올 것이다

Apples are great!

PHP 5.3부터 삼항 연산자의 중간 부분을 생략 할 수 있습니다. 표현식 expr1? : expr3은 expr1이 TRUE로 평가되면 expr1을 반환하고 그렇지 않으면 expr3을 반환합니다.

보내는 사람 PHP 매뉴얼

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.