Bagaimana mengkonversi string ke boolean php

318

Bagaimana saya bisa mengkonversi string boolean?

$string = 'false';

$test_mode_mail = settype($string, 'boolean');

var_dump($test_mode_mail);

if($test_mode_mail) echo 'test mode is on.';

ia kembali,

boolean benar

tapi seharusnya begitu boolean false.

laukok
sumber
Mengapa ada yang menjawab tentang $ bool = !! $ string1?
zloctb
1
@ zloctb karena tidak menjawab pertanyaan. !!$string1akan mengembalikan indikasi boolean dari string yang diuraikan dalam jawaban teratas.
David Barker

Jawaban:

347

String selalu mengevaluasi ke boolean true kecuali mereka memiliki nilai yang dianggap "kosong" oleh PHP (diambil dari dokumentasi untukempty ):

  1. "" (string kosong);
  2. "0" (0 sebagai string)

Jika Anda perlu menetapkan boolean berdasarkan nilai teks dari suatu string, maka Anda harus memeriksa keberadaan atau nilai tersebut.

$test_mode_mail = $string === 'true'? true: false;

EDIT: kode di atas dimaksudkan untuk kejelasan pemahaman. Dalam penggunaan aktual, kode berikut mungkin lebih sesuai:

$test_mode_mail = ($string === 'true');

atau mungkin penggunaan filter_varfungsi dapat mencakup lebih banyak nilai boolean:

filter_var($string, FILTER_VALIDATE_BOOLEAN);

filter_varmencakup seluruh rentang nilai, termasuk nilai-nilai truthy "true", "1", "yes"dan "on". Lihat di sini untuk detail lebih lanjut.

GordonM
sumber
5
Saya sarankan untuk selalu menggunakan perbandingan ketat, jika Anda tidak yakin apa yang Anda lakukan:$string === 'true'
Znarkus
248
Saya menemukan ini - filter_var($string, FILTER_VALIDATE_BOOLEAN);apakah itu hal yang baik?
laukok
10
Terner sepertinya tidak perlu. Mengapa tidak menetapkan $ test_mode_mail ke nilai ketimpangan? $ test_mode_mail = $ string === 'true'
Tim Banks
3
Tapi bagaimana dengan 1/0, BENAR / SALAH? Saya pikir jawaban @ lauthiamkok adalah yang terbaik.
ryabenko-pro
1
@FelipeTadeo Saya sedang berbicara tentang bagaimana PHP mengevaluasi string sehubungan dengan operasi boolean, saya tidak pernah menyebutkan eval () dan saya tidak pernah merekomendasikan menggunakannya dalam keadaan apa pun. String "(3 <5)" akan dievaluasi oleh PHP sebagai boolean true karena tidak kosong.
GordonM
648

Metode ini diposting oleh @ lauthiamkok di komentar. Saya mempostingnya di sini sebagai jawaban untuk lebih memperhatikannya.

Tergantung pada kebutuhan Anda, Anda harus mempertimbangkan menggunakan filter_var()dengan FILTER_VALIDATE_BOOLEANbendera.

filter_var(    true, FILTER_VALIDATE_BOOLEAN); // true
filter_var(    'true', FILTER_VALIDATE_BOOLEAN); // true
filter_var(         1, FILTER_VALIDATE_BOOLEAN); // true
filter_var(       '1', FILTER_VALIDATE_BOOLEAN); // true
filter_var(      'on', FILTER_VALIDATE_BOOLEAN); // true
filter_var(     'yes', FILTER_VALIDATE_BOOLEAN); // true

filter_var(   false, FILTER_VALIDATE_BOOLEAN); // false
filter_var(   'false', FILTER_VALIDATE_BOOLEAN); // false
filter_var(         0, FILTER_VALIDATE_BOOLEAN); // false
filter_var(       '0', FILTER_VALIDATE_BOOLEAN); // false
filter_var(     'off', FILTER_VALIDATE_BOOLEAN); // false
filter_var(      'no', FILTER_VALIDATE_BOOLEAN); // false
filter_var('asdfasdf', FILTER_VALIDATE_BOOLEAN); // false
filter_var(        '', FILTER_VALIDATE_BOOLEAN); // false
filter_var(      null, FILTER_VALIDATE_BOOLEAN); // false
Brad
sumber
5
Menurut dokumentasi, fungsi ini tersedia untuk PHP 5> = 5.2.0. php.net/manual/en/function.filter-var.php
Westy92
4
Saya sangat suka solusi ini untuk menetapkan boolean berdasarkan atribut shortcode WordPress yang memiliki nilai seperti true, false, on, 0, dll. Jawaban yang bagus, pastilah jawaban yang diterima.
AndyWarren
11
filter_var($answer, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)bekerja lebih baik untuk saya. Lihat php.net/manual/en/function.filter-var.php#121263
Ryan
!! Catatan penting !! filter_var mengembalikan juga FALSE jika filter gagal. Ini dapat menimbulkan beberapa masalah.
AFA Med
35

String "false" sebenarnya dianggap sebagai"TRUE" nilai oleh PHP. Dokumentasi mengatakan:

Untuk secara eksplisit mengkonversi nilai menjadi boolean, gunakan cetakan (bool) atau (boolean). Namun, dalam banyak kasus para pemain tidak perlu, karena nilai akan secara otomatis dikonversi jika operator, fungsi atau struktur kontrol memerlukan argumen boolean.

Lihat juga Jenis Juggling.

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

  • objek dengan variabel anggota nol (hanya PHP 4)

  • tipe khusus NULL (termasuk variabel tidak disetel)

  • Objek SimpleXML dibuat dari tag kosong

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

jadi jika Anda melakukannya:

$bool = (boolean)"False";

atau

$test = "false";
$bool = settype($test, 'boolean');

dalam kedua kasus $boolakan TRUE. Jadi, Anda harus melakukannya secara manual, seperti yang disarankan GordonM.

wosis
sumber
1
Euhm, tentu saja yang lebih rendah mengembalikan false. Bahkan, ia melempar fatal :) "Kesalahan fatal: Hanya variabel yang dapat dilewatkan dengan referensi" $ a = 'Salah'; settype ($ a, 'boolean'); var_dump ($ a); memang akan kembali salah.
Rob
16

Ketika bekerja dengan JSON, saya harus mengirim nilai Boolean via $_POST. Saya memiliki masalah yang sama ketika saya melakukan sesuatu seperti:

if ( $_POST['myVar'] == true) {
    // do stuff;
}

Dalam kode di atas, Boolean saya dikonversi menjadi string JSON.

Untuk mengatasinya, Anda dapat mendekode string menggunakan json_decode():

//assume that : $_POST['myVar'] = 'true';
 if( json_decode('true') == true ) { //do your stuff; }

(Ini biasanya bekerja dengan nilai Boolean yang dikonversi ke string dan dikirim ke server juga dengan cara lain, yaitu, selain menggunakan JSON.)

Nishanth Shaan
sumber
11

Anda dapat menggunakan json_decode untuk memecahkan kode boolean itu

$string = 'false';
$boolean = json_decode($string);
if($boolean) {
  // Do something
} else {
  //Do something else
}
suparno majumder
sumber
json_decode juga akan bertransformasi menjadi integer jika string yang diberikan adalah integer
Mihai Răducanu
1
Ya, itu benar, tetapi disebutkan bahwa string memiliki nilai boolean
souparno majumder
8
(boolean)json_decode(strtolower($string))

Ini menangani semua kemungkinan varian $string

'true'  => true
'True'  => true
'1'     => true
'false' => false
'False' => false
'0'     => false
'foo'   => false
''      => false
mrded
sumber
Bagaimana dengan ondan off?
Cyclonecode
7

Jika variabel "boolean" Anda berasal dari array global seperti $ _POST dan $ _GET, Anda dapat menggunakan filter_input()fungsi filter.

Contoh untuk POST:

$isSleeping  = filter_input(INPUT_POST, 'is_sleeping',  FILTER_VALIDATE_BOOLEAN);

Jika variabel "boolean" Anda berasal dari sumber lain, Anda dapat menggunakan filter_var()fungsi filter.

Contoh:

filter_var('true', FILTER_VALIDATE_BOOLEAN); // true
SandroMarques
sumber
7

Kamu bisa memakai boolval($strValue)

Contoh:

<?php
echo '0:        '.(boolval(0) ? 'true' : 'false')."\n";
echo '42:       '.(boolval(42) ? 'true' : 'false')."\n";
echo '0.0:      '.(boolval(0.0) ? 'true' : 'false')."\n";
echo '4.2:      '.(boolval(4.2) ? 'true' : 'false')."\n";
echo '"":       '.(boolval("") ? 'true' : 'false')."\n";
echo '"string": '.(boolval("string") ? 'true' : 'false')."\n";
echo '"0":      '.(boolval("0") ? 'true' : 'false')."\n";
echo '"1":      '.(boolval("1") ? 'true' : 'false')."\n";
echo '[1, 2]:   '.(boolval([1, 2]) ? 'true' : 'false')."\n";
echo '[]:       '.(boolval([]) ? 'true' : 'false')."\n";
echo 'stdClass: '.(boolval(new stdClass) ? 'true' : 'false')."\n";
?>

Dokumentasi http://php.net/manual/es/function.boolval.php

anayarojo
sumber
2
echo boolval('false');=> 1
Mubashar
Anda dapat menggunakan echo (int)'false;atauecho intval('false');
anayarojo
@anayarojo (int)'true'dan intval('true')keduanya kembali 0 juga (semua string lakukan)
sketchyTech
4

hal termudah untuk dilakukan adalah ini:

$str = 'TRUE';

$boolean = strtolower($str) == 'true' ? true : false;

var_dump($boolean);

Melakukannya dengan cara ini, Anda dapat mengulangi serangkaian 'benar', 'BENAR', 'salah' atau 'SALAH' dan mendapatkan nilai string ke boolean.

Brandon Sanders
sumber
3

Jawaban lain terlalu rumit. Pertanyaan ini hanyalah pertanyaan logis . Dapatkan pernyataan Anda dengan benar.

$boolString = 'false';
$result = 'true' === $boolString;

Sekarang jawaban Anda akan baik

  • false, jika string itu 'false' ,
  • atau true, jika string Anda 'true'.

Saya harus perhatikan bahwa filter_var( $boolString, FILTER_VALIDATE_BOOLEAN );masih akan menjadi pilihan yang lebih baik jika Anda perlu memiliki string seperti on/yes/1sebagai alias untuk true.

kaisar
sumber
3
function stringToBool($string){
    return ( mb_strtoupper( trim( $string)) === mb_strtoupper ("true")) ? TRUE : FALSE;
}

atau

function stringToBool($string) {
    return filter_var($string, FILTER_VALIDATE_BOOLEAN);
}
Dmitry
sumber
3
filter_var($string, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);

$string = 1; // true
$string ='1'; // true
$string = 'true'; // true
$string = 'trUe'; // true
$string = 'TRUE'; // true
$string = 0; // false
$string = '0'; // false
$string = 'false'; // false
$string = 'False'; // false
$string = 'FALSE'; // false
$string = 'sgffgfdg'; // null

Anda harus menentukan

FILTER_NULL_ON_FAILURE
jika tidak, Anda akan selalu salah meskipun $ string berisi sesuatu yang lain.

yoben
sumber
2

Anda dapat menggunakan metode settype juga!

SetType ($ var, "Boolean") Echo $ var // lihat 0 atau 1

Tidak
sumber
2

Saya melakukannya dengan cara yang akan membuang versi case case dari "false" yang tidak sensitif ke boolean FALSE, tetapi akan berperilaku menggunakan aturan casting php normal untuk semua string lainnya. Saya pikir ini adalah cara terbaik untuk mencegah perilaku yang tidak terduga.

$test_var = 'False';
$test_var = strtolower(trim($test_var)) == 'false' ? FALSE : $test_var;
$result = (boolean) $test_var;

Atau sebagai fungsi:

function safeBool($test_var){
    $test_var = strtolower(trim($test_var)) == 'false' ? FALSE : $test_var;
    return (boolean) $test_var;
}
Kesalahan sintaks
sumber
2

Jawaban oleh @GordonM bagus. Tetapi akan gagal jika $stringsudah true(yaitu, string bukan string tetapi boolean BENAR) ... yang tampaknya tidak logis.

Memperluas jawabannya, saya akan menggunakan:

$test_mode_mail = ($string === 'true' OR $string === true));
Ema4rl
sumber
0

Saya semakin bingung dengan atribut shortcode wordpress, saya memutuskan untuk menulis fungsi kustom untuk menangani semua kemungkinan. mungkin bermanfaat bagi seseorang:

function stringToBool($str){
    if($str === 'true' || $str === 'TRUE' || $str === 'True' || $str === 'on' || $str === 'On' || $str === 'ON'){
        $str = true;
    }else{
        $str = false;
    }
    return $str;
}
stringToBool($atts['onOrNot']);
tomi
sumber
1
Saya mencari bantuan di tempat pertama, tetapi tidak menemukan apa pun semudah yang saya harapkan. itu sebabnya saya menulis fungsi saya sendiri. jangan ragu untuk menggunakannya.
tomi
-1

Cara sederhana adalah dengan memeriksa terhadap array nilai yang Anda anggap benar.

$wannabebool = "false";
$isTrue = ["true",1,"yes","ok","wahr"];
$bool = in_array(strtolower($wannabebool),$isTrue);
Tajin
sumber
-1

Diedit untuk menunjukkan kemungkinan yang tidak disebutkan di sini, karena jawaban asli saya jauh dari terkait dengan pertanyaan OP.

preg_match (); Apakah mungkin untuk digunakan. Namun, dalam sebagian besar aplikasi akan jauh lebih berat untuk digunakan daripada jawaban lain di sini.

if (preg_match("/true/i", "true PHP is a web scripting language of choice.")) {
    echo "<br><br>Returned true";
} else {
    echo "<br><br>Returned False";
}

/(?:true)|(?:1)/iDapat juga digunakan jika diperlukan dalam situasi tertentu. Itu tidak akan kembali dengan benar ketika mengevaluasi string yang mengandung "false" dan "1".

JSG
sumber
Ini bukan yang diminta. Pertanyaannya adalah bagaimana mengubah string menjadi boolean.
mrded
mrded: Saya salah membaca pertanyaan yang saya minta maaf. Jadi dalam semangat bentuk yang baik saya akan menambahkan kemungkinan lain yang tidak disebutkan di sini.
JSG
-1

Di PHP Anda cukup mengonversi nilai menjadi boolean dengan menggunakan operator ganda bukan ( !!):

var_dump(!! true);     // true
var_dump(!! "Hello");  // true
var_dump(!! 1);        // true
var_dump(!! [1, 2]);   // true
var_dump(!! false);    // false
var_dump(!! null);     // false
var_dump(!! []);       // false
var_dump(!! 0);        // false
var_dump(!! '');       // false
AliN11
sumber
-4

Anda harus dapat menggunakan boolean menggunakan (bool) tapi saya tidak yakin tanpa memeriksa apakah ini bekerja pada string "true" dan "false".

Ini mungkin layak dicoba

$myBool = (bool)"False"; 

if ($myBool) {
    //do something
}

Perlu diketahui bahwa yang berikut ini akan mengevaluasi ke boolean False ketika dimasukkan ke dalam

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

Semua hal lain akan dinilai benar.

Seperti yang dijelaskan di sini: http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

dougajmcdonald
sumber
6
Menanggapi tebakan di paragraf pertama Anda: menggunakan pemeran eksplisit untuk boolean akan dikonversi "false"menjadi true.
Mark Amery
2
Ini akan mencetak "true"$myBool = (bool)"False"; if ($myBool) { echo "true"; }
SSH
2
Ini salah, string dievaluasi sebagai benar kecuali jika mengandung "" atau "0".
Michael J. Calkins