Cách chuyển đổi chuỗi thành php boolean


318

Làm thế nào tôi có thể chuyển đổi chuỗi thành boolean?

$string = 'false';

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

var_dump($test_mode_mail);

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

nó trở lại,

boolean đúng

nhưng nó phải là boolean false.


Tại sao có câu trả lời về $ bool = !! $ string1?
zloctb

1
@zloctb vì nó không trả lời câu hỏi. !!$string1sẽ trả về một chỉ thị boolean của chuỗi được nêu trong câu trả lời được xếp hạng hàng đầu.
David Barker

Câu trả lời:


347

Các chuỗi luôn đánh giá thành boolean true trừ khi chúng có giá trị được coi là "trống" bởi PHP (lấy từ tài liệu choempty ):

  1. "" (một chuỗi rỗng);
  2. "0" (0 dưới dạng chuỗi)

Nếu bạn cần đặt boolean dựa trên giá trị văn bản của chuỗi, thì bạn sẽ cần kiểm tra sự hiện diện hoặc mặt khác của giá trị đó.

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

EDIT: đoạn mã trên nhằm mục đích rõ ràng. Trong thực tế sử dụng mã sau đây có thể phù hợp hơn:

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

hoặc có thể sử dụng filter_varhàm có thể bao gồm nhiều giá trị boolean hơn:

filter_var($string, FILTER_VALIDATE_BOOLEAN);

filter_varbao gồm một loạt các giá trị, bao gồm các giá trị truthy "true", "1", "yes""on". Xem ở đây để biết thêm chi tiết.


5
Tôi khuyên bạn luôn luôn sử dụng so sánh nghiêm ngặt, nếu bạn không chắc chắn mình đang làm gì:$string === 'true'
Znarkus

248
Tôi tìm thấy điều này - filter_var($string, FILTER_VALIDATE_BOOLEAN);nó là một điều tốt?
laukok

10
Chim nhạn dường như không cần thiết. Tại sao không chỉ đặt $ test_mode_mail thành giá trị của bất đẳng thức? $ test_mode_mail = $ string === 'true'
Tim Banks

3
Nhưng những gì về 1/0, TRUE / FALSE? Tôi nghĩ câu trả lời của @lauthiamkok là tốt nhất.
ryabenko-pro

1
@FelipeTadeo Tôi đang nói về cách PHP đánh giá các chuỗi liên quan đến các hoạt động boolean, tôi không bao giờ đề cập đến eval () và tôi không bao giờ khuyên bạn nên sử dụng nó trong bất kỳ trường hợp nào. Chuỗi "(3 <5)" sẽ được PHP đánh giá là boolean true vì nó không trống.
GordonM

648

Phương pháp này đã được đăng bởi @lauthiamkok trong các bình luận. Tôi đang đăng nó ở đây như một câu trả lời để kêu gọi sự chú ý nhiều hơn đến nó.

Tùy thuộc vào nhu cầu của bạn, bạn nên xem xét sử dụng filter_var()với FILTER_VALIDATE_BOOLEANcờ.

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
Theo tài liệu này, chức năng này có sẵn cho PHP 5> = 5.2.0. php.net/manual/en/function.filter-var.php
Westy92

4
Tôi thực sự thích giải pháp này để thiết lập booleans dựa trên các thuộc tính shortcode WordPress có các giá trị như true, false, on, 0, v.v. Câu trả lời tuyệt vời, chắc chắn nên là câu trả lời được chấp nhận.
AndyWarren

11
filter_var($answer, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)làm việc tốt hơn cho tôi Xem php.net/manual/en/feft.filter-var.php#121263
Ryan

!! Lưu ý quan trọng !! filter_var cũng trả về SAI nếu bộ lọc bị lỗi. Điều này có thể tạo ra một số vấn đề.
AFA Med

35

Chuỗi "false" thực sự được coi là một "TRUE"giá trị của PHP. Các tài liệu nói:

Để chuyển đổi rõ ràng một giá trị thành boolean, hãy sử dụng các phôi (bool) hoặc (boolean). Tuy nhiên, trong hầu hết các trường hợp, việc truyền là không cần thiết, vì một giá trị sẽ được tự động chuyển đổi nếu một toán tử, hàm hoặc cấu trúc điều khiển yêu cầu một đối số boolean.

Xem thêm Kiểu tung hứng.

Khi chuyển đổi sang boolean, các giá trị sau được coi là FALSE:

  • FALSE boolean chính nó

  • số nguyên 0 (không)

  • số float 0,0 (không)

  • chuỗi rỗng và chuỗi "0"

  • một mảng có các phần tử bằng không

  • một đối tượng có các biến thành viên bằng không (chỉ có PHP 4)

  • loại NULL đặc biệt (bao gồm các biến không đặt)

  • Các đối tượng SimpleXML được tạo từ các thẻ trống

Mọi giá trị khác được coi là ĐÚNG (bao gồm mọi tài nguyên).

vì vậy nếu bạn làm:

$bool = (boolean)"False";

hoặc là

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

trong cả hai trường hợp $boolsẽ được TRUE. Vì vậy, bạn phải làm điều đó bằng tay, như GordonM gợi ý.


1
Euhm, thông thường, cái thấp hơn trả về false. Trong thực tế, nó ném một lỗi nghiêm trọng :) "Lỗi nghiêm trọng: Chỉ các biến có thể được chuyển qua tham chiếu". $ a = 'Sai'; settype ($ a, 'boolean'); var_dump ($ a); thực sự sẽ trả lại sai.
Cướp

16

Khi làm việc với JSON, tôi đã phải gửi một giá trị Boolean qua $_POST. Tôi đã có một vấn đề tương tự khi tôi làm một cái gì đó như:

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

Trong đoạn mã trên, Boolean của tôi đã được chuyển đổi thành chuỗi JSON.

Để khắc phục điều này, bạn có thể giải mã chuỗi bằng cách sử dụng json_decode():

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

(Điều này thường hoạt động với các giá trị Boolean được chuyển đổi thành chuỗi và cũng được gửi đến máy chủ bằng các phương tiện khác, ngoài việc sử dụng JSON.)


11

bạn có thể sử dụng json_decode để giải mã boolean đó

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

json_decode cũng sẽ chuyển đổi thành số nguyên nếu chuỗi đã cho là một số nguyên
Mihai Răducanu

1
Vâng, đó là sự thật, nhưng nó đã đề cập rằng chuỗi đang giữ giá trị boolean
souparno majumder

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

Nó xử lý tất cả các biến thể có thể có của $string

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

Còn về onoff?
Cyclonecode

7

Nếu biến "boolean" của bạn đến từ một mảng toàn cầu như $ _POST và $ _GET, bạn có thể sử dụng filter_input()chức năng lọc.

Ví dụ cho POST:

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

Nếu biến "boolean" của bạn đến từ nguồn khác, bạn có thể sử dụng filter_var()chức năng lọc.

Thí dụ:

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

7

Bạn có thể dùng boolval($strValue)

Ví dụ:

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

Tài liệu http://php.net/manual/es/feft.boolval.php


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

Bạn có thể sử dụng echo (int)'false;hoặcecho intval('false');
anayarojo

@anayarojo (int)'true'intval('true')cả hai đều trả về 0 (tất cả các chuỗi đều được)
sketchyTech

4

điều dễ nhất để làm là đây:

$str = 'TRUE';

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

var_dump($boolean);

Thực hiện theo cách này, bạn có thể lặp qua một loạt 'true', 'TRUE', 'false' hoặc 'FALSE' và nhận giá trị chuỗi thành boolean.


3

Những câu trả lời khác là quá phức tạp. Câu hỏi này chỉ đơn giản là câu hỏi logic . Chỉ cần nhận được tuyên bố của bạn đúng.

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

Bây giờ câu trả lời của bạn sẽ là một trong hai

  • false, nếu chuỗi là 'false',
  • hoặc true, nếu chuỗi của bạn là 'true'.

Tôi phải lưu ý rằng filter_var( $boolString, FILTER_VALIDATE_BOOLEAN );vẫn sẽ là một lựa chọn tốt hơn nếu bạn cần có các chuỗi như on/yes/1bí danh cho true.


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

hoặc là

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

Bạn phải xác định

FILTER_NULL_ON_FAILURE
nếu không, bạn sẽ luôn bị sai ngay cả khi chuỗi $ chứa thứ khác.


2

Bạn có thể sử dụng phương pháp settype quá!

SetType ($ var, "Boolean") Echo $ var // xem 0 hoặc 1


2

Tôi làm theo cách mà sẽ đưa bất kỳ phiên bản không nhạy cảm nào của chuỗi "false" sang FALSE boolean, nhưng sẽ hành xử bằng cách sử dụng các quy tắc đúc php bình thường cho tất cả các chuỗi khác. Tôi nghĩ rằng đây là cách tốt nhất để ngăn chặn hành vi bất ngờ.

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

Hoặc như một chức năng:

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

2

Câu trả lời của @GordonM là tốt. Nhưng nó sẽ thất bại nếu $stringđã có true(nghĩa là chuỗi không phải là chuỗi mà là TRUE boolean) ... có vẻ phi logic.

Mở rộng câu trả lời của anh ấy, tôi sẽ sử dụng:

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

0

Tôi đã bị lẫn lộn với các thuộc tính shortcode wordpress, tôi quyết định viết một hàm tùy chỉnh để xử lý tất cả các khả năng. có lẽ nó hữu ích cho ai đó:

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
Tôi đã tìm kiếm sự giúp đỡ ngay từ đầu, nhưng không tìm thấy điều gì dễ dàng như tôi hy vọng. đó là lý do tại sao tôi viết chức năng của riêng tôi. Hãy sử dụng nó.
tomi

-1

Một cách đơn giản là kiểm tra đối với một loạt các giá trị mà bạn cho là đúng.

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

-1

Đã chỉnh sửa để hiển thị một khả năng không được đề cập ở đây, vì câu trả lời ban đầu của tôi không liên quan đến câu hỏi của OP.

preg_match (); Có thể sử dụng. Tuy nhiên, trong hầu hết các ứng dụng, nó sẽ nặng hơn nhiều để sử dụng so với các câu trả lời khác ở đây.

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)/iCũng có thể được sử dụng nếu cần thiết trong một số tình huống. Nó sẽ không trả về chính xác khi nó đánh giá một chuỗi chứa cả "false" và "1".


Đây không phải là những gì đã được hỏi. Câu hỏi là làm thế nào để chuyển đổi một chuỗi thành boolean.
ghi

mrded: Tôi đọc sai câu hỏi tôi xin lỗi. Vì vậy, trong tinh thần hình thức tốt, tôi sẽ thêm một khả năng khác không được đề cập ở đây.
JSG

-1

Trong PHP, bạn chỉ cần chuyển đổi một giá trị thành boolean bằng cách sử dụng double not toán tử ( !!):

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

Bạn sẽ có thể chuyển sang boolean bằng cách sử dụng (bool) nhưng tôi không chắc chắn nếu không kiểm tra xem điều này có hoạt động trên chuỗi "true" và "false" hay không.

Điều này có thể đáng giá một pop mặc dù

$myBool = (bool)"False"; 

if ($myBool) {
    //do something
}

Điều đáng biết là những điều sau đây sẽ đánh giá sai boolean khi đặt bên trong

if()
  • FALSE boolean chính nó
  • số nguyên 0 (không)
  • số float 0,0 (không)
  • chuỗi rỗng và chuỗi "0"
  • một mảng có các phần tử bằng không
  • một đối tượng có các biến thành viên bằng không (chỉ có PHP 4)
  • loại NULL đặc biệt (bao gồm các biến không đặt)
  • Các đối tượng SimpleXML được tạo từ các thẻ trống

Mọi thứ khác sẽ đánh giá là đúng.

Như đã giải thích ở đây: http://www.php.net/manual/en/lingu.types.boolean.php#lingu.types.boolean.casting


6
Để đáp ứng với dự đoán trong đoạn đầu tiên của bạn: sử dụng một diễn viên rõ ràng để boolean sẽ chuyển đổi "false"thành true.
Đánh dấu Amery

2
Điều này sẽ in "đúng"$myBool = (bool)"False"; if ($myBool) { echo "true"; }
SSH

2
Điều này là sai, các chuỗi được đánh giá là đúng trừ khi chúng chứa "" hoặc "0".
Michael J. Calkins
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.