วิธีการแปลงสตริงเป็นบูลีน php


318

ฉันจะแปลงสตริงเป็นbooleanอย่างไร

$string = 'false';

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

var_dump($test_mode_mail);

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

มันกลับมา

บูลีนจริง

boolean falseแต่มันควรจะเป็น


ทำไมคำตอบใด ๆ เกี่ยวกับ $ bool = !! $ string1
zloctb

1
@zloctb เพราะไม่ตอบคำถาม !!$string1จะส่งคืนบูลีนที่บ่งบอกถึงสตริงที่ระบุไว้ในคำตอบที่ได้รับความนิยมสูงสุด
David Barker

คำตอบ:


347

สตริงจะประเมินเป็นบูลีนจริงเสมอเว้นแต่จะมีค่าที่ถูกพิจารณาว่า "ว่างเปล่า" โดย PHP (นำมาจากเอกสารประกอบสำหรับempty ):

  1. "" (สตริงว่าง);
  2. "0" (0 เป็นสตริง)

หากคุณต้องการตั้งค่าบูลีนตามค่าข้อความของสตริงคุณจะต้องตรวจสอบการมีอยู่หรือค่าอื่น ๆ

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

แก้ไข: รหัสข้างต้นมีไว้เพื่อความชัดเจนของความเข้าใจ ในการใช้งานจริงรหัสต่อไปนี้อาจจะเหมาะสมกว่า:

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

หรืออาจใช้filter_varฟังก์ชันอาจครอบคลุมค่าบูลีนเพิ่มเติม:

filter_var($string, FILTER_VALIDATE_BOOLEAN);

filter_varครอบคลุมทั้งช่วงของค่ารวมทั้งค่า truthy "true", "1", และ"yes" "on"ดูที่นี่สำหรับรายละเอียดเพิ่มเติม


5
ผมขอแนะนำให้ใช้การเปรียบเทียบที่เข้มงวดถ้าคุณไม่แน่ใจว่าสิ่งที่คุณทำ:$string === 'true'
Znarkus

248
ฉันพบสิ่งนี้ - filter_var($string, FILTER_VALIDATE_BOOLEAN);มันเป็นสิ่งที่ดีหรือไม่?
laukok

10
ดูเหมือนจะไม่จำเป็นต้องประกอบไปด้วยไตรภาค ทำไมไม่ตั้งค่า $ test_mode_mail เป็นค่าของความไม่เท่าเทียมกัน $ test_mode_mail = $ string === 'true'
Tim Banks

3
แต่แล้วประมาณ 1/0, TRUE / FALSE ฉันคิดว่าคำตอบของ @lauthiamkok นั้นดีที่สุด
ryabenko-pro

1
@FelipeTadeo ฉันกำลังพูดถึงวิธี PHP ประเมินสตริงที่เกี่ยวกับการดำเนินการบูลีนฉันไม่เคยพูดถึง eval () และฉันไม่เคยแนะนำให้ใช้ในกรณีใด ๆ สตริง "(3 <5)" จะถูกประเมินโดย PHP เป็นบูลีนจริงเพราะไม่ว่างเปล่า
GordonM

647

วิธีการนี้ถูกโพสต์โดย @lauthiamkok ในความคิดเห็น ฉันโพสต์ไว้ที่นี่เป็นคำตอบที่จะเรียกร้องความสนใจมากขึ้น

ขึ้นอยู่กับความต้องการของคุณคุณควรพิจารณาใช้filter_var()กับFILTER_VALIDATE_BOOLEANธง

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

5
ตามเอกสารประกอบฟังก์ชั่นนี้มีให้สำหรับ PHP 5> = 5.2.0 php.net/manual/th/function.filter-var.php
Westy92

4
ฉันชอบโซลูชันนี้สำหรับการตั้งค่า booleans ตามแอตทริบิวต์รหัสย่อของ WordPress ที่มีค่าเช่นจริง, เท็จ, บน, 0, ฯลฯ คำตอบที่ดีควรเป็นคำตอบที่ยอมรับได้อย่างแน่นอน
AndyWarren

11
filter_var($answer, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)ทำงานได้ดียิ่งขึ้นสำหรับฉัน ดูphp.net/manual/en/function.filter-var.php#121263
Ryan

!! โน๊ตสำคัญ !! filter_var ส่งคืนค่าเป็น FALSE หากตัวกรองล้มเหลว นี่อาจสร้างปัญหาบางอย่าง
AFA Med

35

สตริง"false" ถือว่าจริง"TRUE"โดยค่า PHP เอกสารบอกว่า:

ในการแปลงค่าเป็นบูลีนอย่างชัดแจ้งให้ใช้คำสั่ง (bool) หรือ (บูลีน) อย่างไรก็ตามในกรณีส่วนใหญ่การโยนนั้นไม่จำเป็นเนื่องจากค่าจะถูกแปลงโดยอัตโนมัติหากโอเปอเรเตอร์ฟังก์ชันหรือโครงสร้างการควบคุมต้องการอาร์กิวเมนต์บูลีน

ดูเพิ่มเติมที่ Type Juggling

เมื่อแปลงเป็นบูลีนค่าต่อไปนี้จะถือเป็น FALSE:

  • บูลีน FALSE เอง

  • จำนวนเต็ม 0 (ศูนย์)

  • ลอย 0.0 (ศูนย์)

  • สตริงว่างและสตริง "0"

  • อาร์เรย์ที่มีองค์ประกอบศูนย์

  • วัตถุที่มีตัวแปรสมาชิกเป็นศูนย์ (PHP 4 เท่านั้น)

  • ชนิดพิเศษ NULL (รวมถึงตัวแปรที่ไม่ได้ตั้งค่า)

  • วัตถุ SimpleXML ที่สร้างจากแท็กเปล่า

ค่าอื่น ๆ ทุกค่าถือเป็น TRUE (รวมถึงทรัพยากรใด ๆ )

ดังนั้นถ้าคุณทำ:

$bool = (boolean)"False";

หรือ

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

ในทั้งสองกรณีจะเป็น$bool TRUEดังนั้นคุณต้องทำด้วยตนเองเหมือนที่ GordonM แนะนำ


1
Euhm แน่นอนว่าคนที่ต่ำกว่ากลับเท็จ ในความเป็นจริงมันส่งผ่านข้อผิดพลาดร้ายแรง :) "ข้อผิดพลาดร้ายแรง: เฉพาะตัวแปรที่สามารถส่งผ่านโดยการอ้างอิง" $ a = 'False'; settype ($ a 'บูล'); var_dump ($ a); จะกลับเท็จอย่างแน่นอน
Rob

16

เมื่อทำงานร่วมกับ JSON $_POSTผมต้องส่งค่าบูลีนผ่านทาง ฉันมีปัญหาคล้ายกันเมื่อฉันทำสิ่งที่ชอบ:

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

ในรหัสข้างต้นบูลีนของฉันถูกแปลงเป็นสตริง JSON

เพื่อเอาชนะสิ่งนี้คุณสามารถถอดรหัสสตริงโดยใช้json_decode():

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

(โดยปกติควรทำงานกับค่าบูลีนที่แปลงเป็นสตริงและส่งไปยังเซิร์ฟเวอร์ด้วยวิธีอื่นเช่นอื่น ๆ ที่ไม่ใช่การใช้ JSON)


11

คุณสามารถใช้ json_decode เพื่อถอดรหัสบูลีนนั้น

$string = 'false';
$boolean = json_decode($string);
if($boolean) {
  // Do something
} else {
  //Do something else
}

json_decode จะแปลงเป็นจำนวนเต็มด้วยเช่นกันถ้าสตริงที่กำหนดเป็นจำนวนเต็ม
Mihai Răducanu

1
ใช่มันเป็นความจริง แต่มันบอกว่าสตริงถือค่าบูลีน
souparno majumder

8
(boolean)json_decode(strtolower($string))

มันจัดการกับตัวแปรที่เป็นไปได้ทั้งหมดของ $string

'true'  => true
'True'  => true
'1'     => true
'false' => false
'False' => false
'0'     => false
'foo'   => false
''      => false

สิ่งที่เกี่ยวกับonและoff?
Cyclonecode

7

หากตัวแปร "บูลีน" ของคุณมาจากอาร์เรย์ทั่วโลกเช่น $ _POST และ $ _GET คุณสามารถใช้filter_input()ฟังก์ชันตัวกรองได้

ตัวอย่างสำหรับ POST:

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

หากตัวแปร "บูลีน" ของคุณมาจากแหล่งอื่นคุณสามารถใช้filter_var()ฟังก์ชันตัวกรองได้

ตัวอย่าง:

filter_var('true', FILTER_VALIDATE_BOOLEAN); // true

7

คุณสามารถใช้ได้ boolval($strValue)

ตัวอย่าง:

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

เอกสารประกอบ http://php.net/manual/es/function.boolval.php


2
echo boolval('false');=> 1
Mubashar

คุณสามารถใช้echo (int)'false;หรือecho intval('false');
anayarojo

@anayarojo (int)'true'และintval('true')ทั้งคู่คืนค่า 0 เช่นกัน (สายทั้งหมดทำ)
sketchyTech

4

สิ่งที่ง่ายที่สุดคือ:

$str = 'TRUE';

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

var_dump($boolean);

ด้วยวิธีนี้คุณสามารถวนลูปผ่านชุด 'true', 'TRUE', 'false' หรือ 'FALSE' และรับค่าสตริงเป็นบูลีน


3

คำตอบอื่น ๆ มีมากกว่าสิ่งที่ซับซ้อน คำถามนี้เป็นคำถามเชิงตรรกะ เพิ่งรับใบแจ้งยอดของคุณ

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

ตอนนี้คำตอบของคุณจะเป็นอย่างใดอย่างหนึ่ง

  • falseถ้าสตริงเป็น'false',
  • หรือถ้าสายของคุณเป็นtrue'true'

ฉันจะต้องทราบว่าfilter_var( $boolString, FILTER_VALIDATE_BOOLEAN );จะยังคงเป็นตัวเลือกที่ดีถ้าคุณจำเป็นต้องมีสายเหมือนเป็นนามแฝงสำหรับon/yes/1true


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

หรือ

function stringToBool($string) {
    return filter_var($string, FILTER_VALIDATE_BOOLEAN);
}

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

คุณต้องระบุ

FILTER_NULL_ON_FAILURE
มิฉะนั้นคุณจะได้รับเท็จเสมอแม้ว่า $ string จะมีอย่างอื่นอยู่



2

ฉันทำมันในลักษณะที่จะส่งสตริงที่ไม่ตรงตามตัวพิมพ์ของ "false" ไปยังบูลีน FALSE แต่จะทำงานโดยใช้กฎการส่ง php ปกติสำหรับสตริงอื่น ๆ ทั้งหมด ฉันคิดว่านี่เป็นวิธีที่ดีที่สุดในการป้องกันพฤติกรรมที่ไม่คาดคิด

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

หรือเป็นฟังก์ชั่น:

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

2

คำตอบโดย@GordonMนั้นดี แต่มันจะล้มเหลวถ้า$stringมีอยู่แล้วtrue(เช่นสตริงไม่ใช่สตริง แต่เป็นบูลีน TRUE) ... ซึ่งดูเหมือนไร้เหตุผล

ขยายคำตอบของเขาฉันจะใช้:

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

0

ฉันสับสนกับคุณสมบัติรหัสย่อของ wordpress ฉันตัดสินใจเขียนฟังก์ชันแบบกำหนดเองเพื่อจัดการกับความเป็นไปได้ทั้งหมด อาจจะมีประโยชน์สำหรับใครบางคน:

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']);

1
ฉันกำลังมองหาความช่วยเหลือในตอนแรก แต่ไม่พบอะไรง่ายอย่างที่ฉันหวังไว้ นั่นเป็นเหตุผลที่ฉันเขียนฟังก์ชันของตัวเอง อย่าลังเลที่จะใช้มัน
tomi

-1

วิธีง่ายๆคือการตรวจสอบอาร์เรย์ของค่าที่คุณพิจารณาว่าเป็นจริง

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

-1

แก้ไขเพื่อแสดงความเป็นไปได้ที่ไม่ได้กล่าวถึงที่นี่เพราะคำตอบดั้งเดิมของฉันยังห่างไกลจากคำถามของ OP

preg_match (); เป็นไปได้ที่จะใช้ อย่างไรก็ตามในแอปพลิเคชันส่วนใหญ่จะใช้งานหนักกว่าคำตอบอื่น ๆ ที่นี่

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)/iสามารถใช้งานได้หากจำเป็นในบางสถานการณ์ จะไม่ส่งคืนอย่างถูกต้องเมื่อประเมินสตริงที่มีทั้ง "false" และ "1"


นี่ไม่ใช่สิ่งที่ถูกถาม คำถามคือวิธีการแปลงสตริงเป็นบูลีน
mrded

mrded: ฉันผิดคำถามที่ฉันขอโทษ ดังนั้นในรูปแบบที่ดีฉันจะเพิ่มความเป็นไปได้อีกอย่างที่ไม่ได้กล่าวถึง
JSG

-1

ใน PHP คุณสามารถแปลงค่าเป็นบูลีนได้โดยใช้double not operator ( !!):

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

-4

คุณควรจะสามารถใช้บูลีนโดยใช้ (บูล) แต่ฉันไม่แน่ใจถ้าไม่ได้ตรวจสอบว่ามันใช้งานได้กับสตริง "จริง" และ "เท็จ"

นี่อาจจะคุ้มค่ากับป๊อป

$myBool = (bool)"False"; 

if ($myBool) {
    //do something
}

มันมีค่าที่จะรู้ว่าสิ่งต่อไปนี้จะประเมินเป็นบูลีนเท็จเมื่อใส่เข้าไปข้างใน

if()
  • บูลีน FALSE เอง
  • จำนวนเต็ม 0 (ศูนย์)
  • ลอย 0.0 (ศูนย์)
  • สตริงว่างและสตริง "0"
  • อาร์เรย์ที่มีองค์ประกอบศูนย์
  • วัตถุที่มีตัวแปรสมาชิกเป็นศูนย์ (PHP 4 เท่านั้น)
  • ชนิดพิเศษ NULL (รวมถึงตัวแปรที่ไม่ได้ตั้งค่า)
  • วัตถุ SimpleXML ที่สร้างจากแท็กเปล่า

ทุกคนจะประเมินเป็นจริง

ตามที่อธิบายไว้ที่นี่: http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting


6
ในการตอบสนองต่อการคาดเดาในวรรคแรกของคุณ: การใช้นักแสดงอย่างชัดเจนในการบูลีนจะแปลงไป"false" true
Mark Amery

2
นี่จะพิมพ์ว่า "จริง"$myBool = (bool)"False"; if ($myBool) { echo "true"; }
SSH

2
นี่เป็นสิ่งที่ผิดสตริงจะถูกประเมินว่าเป็นจริงเว้นแต่ว่าจะมี "" หรือ "0"
Michael J. Calkins
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.