Pertanyaan sederhana jika pernyataan (bukan tangan pendek)


Jadi hari ini, setiap hari, saya memprogram. Mengikuti bisnis saya yang biasa, mengetik, mendengarkan Daft Punk dan berbagai lagu asyik lainnya. Kemudian tiba-tiba, saya harus menulis sesuatu di sepanjang baris:

$x = 'a'; // For instance

if ($x == 'a' || $x == 'b') {
    // ...
}

Cukup sederhana, tidak terlalu lusuh menurutku. Tapi tunggu! Saya berpikir sendiri "there must be an easier way to do that - I'm repeating myself". Jadi saya mulai berusaha memecahkan masalah ini dengan kode berikut:

if ($x == ('a' || 'b')) { 
    // ...
}

Namun, itu tidak berhasil. Sama sekali. Nya selalu benar. Jika $x adalah sama dengan a, b, c atau cake. Jadi saya merajuk, menangis sedikit dan memutuskan untuk bertanya kepada Stackoverflow jika ada dari kalian yang tahu mengapa.

Terima kasih!


4
2017-07-30 18:26


asal


Jawaban:


|| adalah logis atau, mengevaluasi sisi kiri sebagai boolean ('a', yang dalam konteks boolean true) dan jika itu benar mengembalikan benar, jika tidak, itu melakukan hal yang sama untuk sisi kanan.

var_dump('a' || 'b');
bool(true)

Sekarang, nilai ini dibandingkan dengan karakter, yang berdasarkan pada aturan PHP yang gila (grafik perbandingan longgar), juga akan menjadi kenyataan:

var_dump('a' == true);
bool(true)

2
2017-07-30 18:32



Anda meminta PHP untuk mengevaluasi jika $x sama dengan nilai ('a' OR 'b'), yang SELALU akan kembali true karena baik 'a' dan 'b' memiliki nilai tidak nol.

Anda harus menggunakan operator perbandingan secara individual dalam kasus ini, atau gunakan saran nickb dari komentar.


1
2017-07-30 18:29



Itu tidak berhasil karena

$a = 'a' || 'b'; // true, since 'a' and 'b' considered truthy

Dalam hal ini, literal string Anda akan menjadi dikonversi ke boolean.

Dan jika Anda $x dalam jika bukan string kosong atau string lain dianggap falsy, mereka akan sama.

Namun Anda dapat menulis jika seperti ini:

if (in_array($x, array('a', 'b', 'cake'))

Jika Anda merasa bahwa itu membuat niat Anda lebih jelas.


1
2017-07-30 18:31



Saya akan melakukan:

$valid = array('a', 'b');

if (in_array($x, $valid)) {
    ...
}

Cukup sederhana!

... tapi, kalau dipikir-pikir, mungkin Anda tidak ingin cara lain untuk melakukannya?


1
2017-07-30 18:32



Seperti yang kamu tahu || adalah operator logis dan selalu mengembalikan true atau false (dalam kata lain 1 atau 0). Jadi, kode ('a' || 'b') selalu mengembalikan nilai true (1). Dalam kasus di atas, $ x mengandung nilai jadi karena percakapan jenis otomatis $ x juga disetel ke true (1) jadi if (1 == 1) dan return selalu true.

coba dengan kode di bawah ini

$x = false;
if ($x == ('a' || 'b')) { echo 'true'; } else{ echo 'false';}

Selalu kembalikan false.


1
2017-07-30 18:52



Lihat bagaimana php mengubah string menjadi boolean

php > var_dump((bool) "a");
bool(true)
php > var_dump((bool) "b");
bool(true)
php > var_dump((bool) "cake");
bool(true)

Jadi pada dasarnya Anda bertanya php if ($ x == true)


0
2017-07-30 18:32



Lihat http://php.net/manual/en/types.comparisons.php


0
2017-07-30 18:32