Bagaimana cara menggunakan operator terner (? :) di PHP sebagai singkatan dari "if / else"?


118

Berdasarkan contoh dari halaman ini , saya memiliki contoh kode yang berfungsi dan tidak berfungsi di bawah ini.

Kode kerja menggunakan ifpernyataan:

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

Kode tidak berfungsi menggunakan operator terner:

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

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

UPDATE
Setelah tip Brian, saya menemukan bahwa $testoutput bergema hasil yang diharapkan. Berikut ini bekerja seperti pesona!

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

4
Ini terlihat benar. Sudahkah Anda mencoba echo $ test ;?
Brian Fisher

Pertanyaan Anda menipu beberapa sukarelawan dan peneliti karena Anda tidak menulis tugas menggunakan ekspresi terner singkatan (tidak ada "Operator Elvis") - Anda menulis ekspresi terner panjang. Perbedaannya adalah Anda mendeklarasikan kedua nilai yang dikembalikan bergantung pada evaluasi. Dalam evaluasi singkat, jika nilai input adalah "kebenaran", itu dikembalikan; jika "falsey" maka nilai fallback dikembalikan (ini adalah nilai yang dinyatakan setelah Operator Elvis). Ada juga implementasi yang sangat buruk dari Null Coalescing Operator di sini juga.
mickmackusa

Jawaban:


234

Itu

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

sintaks bukan operator "shorthand if" ( ?disebut operator bersyarat) karena Anda tidak dapat mengeksekusi kode dengan cara yang sama seperti jika Anda melakukannya:

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

Dalam contoh Anda, Anda menjalankan echopernyataan saat $addressisian tidak kosong. Anda tidak dapat melakukan ini dengan cara yang sama dengan operator bersyarat. Namun, apa yang dapat Anda lakukan adalah echohasil dari operator bersyarat:

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

dan ini akan menampilkan "Jalan kosong!" jika kosong, jika tidak maka akan menampilkan alamat jalan2.


Ini perbedaan antara pernyataan dan ekspresi
pmiranda

2
apa singkatannya lagi? condition ?: falseyang mengevaluasi conditionapakah itu benar?
oldboy

44

PHP 7+

Mulai dari PHP 7, tugas ini dapat dilakukan hanya dengan menggunakan operator penggabungan Null seperti ini:

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


3
FYI saja, jika $address['street2']adalah string kosong. Ia akan menerimanya dan tidak akan kembali 'Empty'. isset() != empty(). Ini hanya akan berfungsi jika nilainya adalahnull
AFwcxx

Nah, saya baru saja memberikan contoh. Tetapi saya telah mengubah kodenya. Terima kasih!
Rabin Lama Dong

2
Apa outputnya jika $address['street2']tidak kosong?
AliN11

Jika $ address ['street2'] tidak kosong, itu akan menampilkan beberapa bentuk "true". Bentuk biasa di atas lebih seperti: echo $address['street2'] ?? 'Empty';namun seperti yang disebutkan, ini adalah " operator penggabungan null " sehingga hanya menguji null dan tidak kosong. Hal ini karena ?? Secara efektif merupakan singkatan dari isset ().
Brian C

1
Masuk hanya untuk tidak menyukai jawaban ini. Ini sama sekali tidak melakukan apa yang diiklankan.
TKoL

28

Deklarasi Dasar Benar / Salah

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

Pesan Selamat Datang Bersyarat

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

Pesan Item Bersyarat

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

ref: https://davidwalsh.name/php-ternary-examples


2
Anda mendapatkannya dari situs web tangan pendek dan bahkan tidak mereferensikannya
Richard

1
@Richard menambahkan referensi
Arun Yokesh

Apakah itu ? Dalam konteks StackOverflow, ini selalu merupakan garis tipis, maksud saya Q meminta sesuatu, tidak dapat menemukannya sendiri, dan kemudian orang lain mengirimkan konten ini. Apakah tidak adil menyalin konten yang ada jika itu membantu dan menambah nilai pada Q / A ini? Saya pikir jawaban di StackOverflow bukanlah "konten Anda sendiri" ... hmmm
Sliq

Contoh pertama salah. Salah )tempat. Ini harus mendahului ?. Pernyataan lengkapnya harus$is_admin = ($user['permissions'] == 'admin') ? true : false;
1934286

12

Operator terner hanyalah singkatan dari dan if / else. Kode kerja Anda tidak memiliki ketentuan lain, jadi tidak cocok untuk ini.

Contoh berikut akan berfungsi:

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

6

Ini adalah operator Ternary alias operator Elvis (google it: P) yang Anda cari.

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

Ini mengembalikan nilai variabel atau default jika variabel kosong.


@Structed Saya tidak bisa tidak setuju dengan apa yang Anda katakan tetapi, mencari di Google untuk ini akan memberi Anda hasil yang tepat dan ini adalah istilah yang lebih mudah untuk diingat
Keyboard ninja

4

Perhatikan bahwa saat menggunakan operator bersyarat bersarang, Anda mungkin ingin menggunakan tanda kurung untuk menghindari kemungkinan masalah!

Sepertinya PHP tidak bekerja dengan cara yang sama seperti setidaknya Javascript atau 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');

Kode yang sama di Javascript dan C # menghasilkan "Luar Biasa" dalam kedua kasus.

Dalam kasus ke-2, apa yang dilakukan PHP adalah (atau setidaknya itulah yang saya mengerti):

  1. adalah $score > 10? Iya
  2. adalah $age > 10? tidak, jadi saat ini $age > 10 ? 'Average' : 'Exceptional'mengembalikan 'Luar Biasa'
  3. kemudian, alih-alih hanya menghentikan seluruh pernyataan dan mengembalikan 'Luar Biasa', ia terus mengevaluasi pernyataan berikutnya
  4. pernyataan berikutnya menjadi 'Exceptional' ? 'Horrible' : 'Average'yang mengembalikan 'Mengerikan', karena 'Luar Biasa' adalah benar

Dari dokumentasi: http://php.net/manual/en/language.operators.comparison.php

Direkomendasikan agar Anda menghindari ekspresi terner "menumpuk". Perilaku PHP saat menggunakan lebih dari satu operator ternary dalam satu pernyataan tidak jelas.


3

Cara cepat dan singkat:

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

Berikut beberapa contoh yang menarik, dengan satu atau lebih kondisi yang bervariasi.

$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

Pesan Selamat Datang Bersyarat

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

Singkatan PHP Bersarang

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

2

Anda dapat melakukan ini lebih pendek lagi dengan mengganti echodengan<?= code ?>

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

Ini berguna terutama ketika Anda ingin menentukan, di dalam bilah navigasi, apakah opsi menu harus ditampilkan sebagai telah dikunjungi (diklik) atau tidak:

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


Apakah () dibutuhkan dalam metode <? =?> Itu?
ikal

0

Saya pikir Anda menggunakan tanda kurung dengan cara yang salah. Coba ini:

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

Saya pikir itu harus berfungsi, Anda juga dapat menggunakan:

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

0

Saya pikir Anda mungkin sebaiknya tidak menggunakan operator terner di php. Pertimbangkan contoh selanjutnya:

<?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);

Bagaimana menurut Anda, $avariabel apa yang akan berisi? (petunjuk: dos) Dan itu akan tetap sama meskipun $foovariabel akan ditetapkan ke 2.

Untuk membuat segalanya lebih baik, Anda harus menolak menggunakan operator ini atau mengelilingi bagian kanan dengan kawat gigi dengan cara berikut:

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

0

Operator Ternary pada dasarnya adalah singkatan dari pernyataan if / else. Kita dapat menggunakan untuk mengurangi beberapa baris kode dan meningkatkan keterbacaan.

Kode Anda terlihat lebih bersih bagi saya. Tapi kita bisa menambahkan cara yang lebih bersih sebagai berikut-

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

Cara lain-

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

Catatan- Saya telah menambahkan tanda kurung ke seluruh ekspresi untuk membuatnya lebih bersih. Saya biasanya melakukan ini untuk meningkatkan keterbacaan. Dengan PHP7 kita bisa menggunakan Null Coalescing Operator / php 7 ?? operator untuk pendekatan yang lebih baik. Tapi kebutuhan Anda itu tidak sesuai.


-1

Ada juga operator terner steno dan terlihat seperti ini:

(ekspresi1)?: ekspresi2 akan mengembalikan ekspresi1 jika dievaluasi benar atau ekspresi2 sebaliknya.

Contoh:

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

akan kembali

Apples are great!

Sejak PHP 5.3, dimungkinkan untuk meninggalkan bagian tengah dari operator terner. Ekspresi expr1?: Expr3 mengembalikan expr1 jika expr1 bernilai TRUE, dan expr3 sebaliknya.

Dari Manual PHP

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.