Parsing string ke dalam nilai boolean dalam PHP

126

Hari ini saya bermain dengan PHP, dan saya menemukan bahwa nilai string "true" dan "false" tidak diuraikan dengan benar ke boolean dalam suatu kondisi, misalnya mempertimbangkan fungsi berikut:

function isBoolean($value) {
   if ($value) {
      return true;
   } else {
      return false;
   }
}

Jika saya menjalankan:

isBoolean("true") // Returns true
isBoolean("") // Returns false
isBoolean("false") // Returns true, instead of false
isBoolean("asd") // Returns true, instead of false

Tampaknya hanya berfungsi dengan nilai "1" dan "0":

isBoolean("1") // Returns true
isBoolean("0") // Returns false

Apakah ada fungsi asli di PHP untuk mem-parsing string "true" dan "false" ke boolean?

Menandai
sumber
Dalam kode Anda, isBoolean("")harus mengembalikan false.
BoltClock
Anda harus mempertimbangkan mengubah jawaban yang diterima menjadi jawaban Eric Caron. Ini menunjukkan kepada Anda fungsi asli yang melakukan apa yang Anda minta.
Komandan Kode
1
PHP tidak berpikir tentang apa kata string, "false" hanya lima karakter yang tidak ada artinya. Mereka adalah sesuatu , jadi nilai boolean dievaluasi untuk truemeskipun untuk pembaca manusia, itu akan tampak lebih intuitif yang dimaksud FALSE.
zeel

Jawaban:

413

Ada metode PHP asli untuk melakukan ini yang menggunakan metode filter_var PHP:

$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN);

Menurut panduan PHP :

Mengembalikan TRUE untuk "1", "true", "on" dan "yes". Mengembalikan FALSE sebaliknya.

Jika FILTER_NULL_ON_FAILURE disetel, FALSE hanya dikembalikan untuk "0", "false", "off", "no", dan "", dan NULL dikembalikan untuk semua nilai non-boolean.

Eric Caron
sumber
Ini seharusnya jawaban yang diterima. Fungsi PHP bawaan lebih baik daripada membangun sendiri. Tidak perlu menemukan kembali roda! Sayang sekali sudah terlambat: P
casraf
1
apakah itu juga mengurangi nilai perbandingan?
Mobiletainment
3
@Mobiletainment, ya - ini menangani semua casing yang dapat Anda bayangkan dengan nilai $ (false, FALSE, FalSe, dll.)
Eric Caron
Testorkus borked di ujung saya. Digunakan == alih-alih === untuk perbandingan. Akan menghapus komentar saya sebelumnya untuk tidak membingungkan orang.
andig
6
Jawabannya membuat saya lengah karena Anda harus menambahkan bendera FILTER_NULL_ON_FAILUREke filter_var()fungsi dan TIDAK menggantinya dengan FILTER_VALIDATE_BOOLEANseperti yang saya pikir. Ini akan menghasilkan kode berikut yang melakukan trik untuk saya:$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)
Dragon54
14

Alasannya adalah bahwa semua string mengevaluasi trueketika mengubahnya menjadi boolean, kecuali "0"dan ""(string kosong).

Fungsi berikut akan melakukan persis apa yang Anda inginkan: berperilaku persis seperti PHP, tetapi juga akan mengevaluasi string "false"sebagai false:

function isBoolean($value) {
   if ($value && strtolower($value) !== "false") {
      return true;
   } else {
      return false;
   }
}

Dokumentasi menjelaskan bahwa: http://php.net/manual/en/language.types.boolean.php :

Saat mengonversi ke boolean, nilai-nilai berikut ini dianggap SALAH:

  • Boolean FALSE itu sendiri
  • integer 0 (nol)
  • float 0,0 (nol)
  • string kosong, dan string "0"
  • sebuah array dengan elemen nol
  • tipe khusus NULL (termasuk variabel tidak disetel)
  • Objek SimpleXML dibuat dari tag kosong

Setiap nilai lainnya dianggap BENAR (termasuk sumber daya apa pun).

Arnaud Le Blanc
sumber
2
+1 Bagus. (Bisa membuang seorang strtolower di sana, tetapi hanya itu saja.)
John Parker
Saya pikir middaparka berarti membandingkan strtolower ($ value) dengan 'false'. Melewati 'false' secara literal ke dalam strtolower sedikit .... sial? :)
Paul Dixon
@ Paul Dixon Yup, itulah yang saya maksud. :-)
John Parker
2
@Marco - if ($ value && strtolower ($ value)! == "faux") {jika Anda bekerja di Perancis; if ($ value && strtolower ($ value)! == "falsch") {dalam bahasa Jerman; if ($ value && strtolower ($ value)! == "onwaar") {dalam bahasa Belanda ... Anda dapat memahami mengapa PHP tidak memiliki standar bawaan ini
Mark Baker
1
"semua string non-kosong bernilai true ketika mengonversinya menjadi boolean, kecuali" 0 "."
BoltClock
5

Hanya dalam PHP "0"atau string kosong memaksa menjadi false; setiap string non-kosong memaksa untuk true. Dari manual :

Saat mengonversi ke boolean, nilai-nilai berikut dipertimbangkan FALSE:

  • string kosong, dan string "0"

Anda perlu menulis fungsi sendiri untuk menangani string "true"vs "false". Di sini, saya menganggap semuanya standarnya salah:

function isBoolean($value) {
   if ($value === "true") {
      return true;
   } else {
      return false;
   }
}

Di samping catatan yang dapat dengan mudah dikondensasi

function isBoolean($value) {
   return $value === "true";
}
BoltClock
sumber
4

Baru-baru ini saya membutuhkan fungsi konversi boolean "longgar" untuk menangani string seperti yang Anda tanyakan (antara lain). Saya menemukan beberapa pendekatan yang berbeda dan menghasilkan satu set besar data uji untuk menjalaninya . Tidak ada yang cukup sesuai dengan kebutuhan saya, jadi saya menulis sendiri:

function loosely_cast_to_boolean($value) {
    if(is_array($value) || $value instanceof Countable) {
        return (boolean) count($value);
    } else if(is_string($value) || is_object($value) && method_exists($value, '__toString')) {
        $value = (string) $value;
        // see http://www.php.net/manual/en/filter.filters.validate.php#108218
        // see https://bugs.php.net/bug.php?id=49510
        $filtered = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
        if(!is_null($filtered)) {
            return $filtered;
        } else {
            // "none" gets special treatment to be consistent with ini file behavior.
            // see documentation in php.ini for more information, in part it says: 
            // "An empty string can be denoted by simply not writing anything after 
            // the equal sign, or by using the None keyword".
            if(strtolower($value) === 'none') {
                $value = '';
            }
            return (boolean) $value;
        }
    } else {
        return (boolean) $value;
    }
}

Perhatikan bahwa untuk objek yang dihitung dan string-castable, ini akan mendukung penghitungan atas nilai string untuk menentukan kebenaran. Yaitu, jika $object instanceof Countableini akan kembali (boolean) count($object)terlepas dari nilai (string) $object.

Anda dapat melihat perilaku untuk data uji yang saya gunakan serta hasil untuk beberapa fungsi lainnya di sini . Agak sulit untuk skim hasil dari iframe kecil itu, jadi Anda dapat melihat output skrip di halaman penuh , bukan (URL itu tidak didokumentasikan sehingga ini mungkin tidak berfungsi selamanya). Kalau-kalau tautan itu mati suatu hari, saya juga menaruh kodenya di pastebin .

Garis antara apa yang "seharusnya benar" dan apa yang tidak seharusnya cukup sewenang-wenang; data yang saya gunakan dikategorikan berdasarkan kebutuhan dan preferensi estetika saya, Anda mungkin berbeda.

Matt Kantor
sumber
Fungsi ini berfungsi dengan sempurna, terima kasih! Tetapi tautan Anda sekarang adalah 404.
servermanfail
3

Saya menggunakan konstruk ini untuk mengubah string menjadi boolean, karena Anda menginginkan truesebagian besar nilai lainnya:

$str = "true";
$bool = !in_array($str, array("false", "", "0", "no", "off"));
mario
sumber
1

Apakah ada fungsi di PHP untuk mem-parsing string "true" dan "false" ke boolean?

Tidak - keduanya adalah string, dan keduanya (seperti yang Anda katakan) dievaluasi true. Hanya string kosong yang dievaluasi falsedalam PHP.

Anda perlu menguji ini secara manual. Namun, jika memungkinkan, akan lebih baik bekerja dengan nilai-nilai boolean "nyata".

Pekka
sumber
1
Tidak semua string dievaluasi truedalam PHP.
coreyward
1
Tidak mengoreksi, hanya mengklarifikasi. Mengatakan "keduanya adalah string [dan mengevaluasi untuk true]" mungkin memberikan kesan yang salah kepada pemula, terutama yang berasal dari bahasa lain dengan aturan pengetikan yang lebih ketat di mana string adalah string dan isinya tidak masalah saat dikonversi ke boolean (seperti Rubi).
coreyward
1
"Hanya string kosong yang dinilai false dalam PHP." Tapi bagaimana dengan string yang tidak kosong "0"? Bukankah ini juga dievaluasi false?
Sepster
0

Cara termudah untuk dengan aman mengkonversi ke boolean;

    $flag = 'true';

    if( filter_var( $flag,FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE ) !== null) {
      $flag = filter_var($flag,FILTER_VALIDATE_BOOLEAN);
    }

    gettype($flag); // Would Return 'Boolean'
    echo 'Val: '.$flag; // Would Output 'Val: 1'
Timothy Perez
sumber
0

Jika API Anda hanya menerima string "benar" atau "salah", yang semuanya menjadinull , maka coba:

$boolean = ['true' => true, 'false' => false][$inputString] ?? null;

Ini mengasumsikan bahwa $inputitu bukan obyek. Null coalesce ( ??) diperkenalkan dalam PHP 7.0.

Matt Janssen
sumber