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 />';
Steven
sumber
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.

John Rasch
sumber
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';

Rabin Lama Dong
sumber
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

Arun Yokesh
sumber
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';
adrianbanks
sumber
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.

Ninja keyboard
sumber
@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.

pengguna276648
sumber
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>";
Belajar dan berbagi
sumber
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') );
Adnan
sumber
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>

Pathros
sumber
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 />');
pengguna2909855
sumber
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");
rela589n
sumber
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.

Pengecualian
sumber
-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

horas_ro
sumber