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


242

Tôi có một biến Boolean mà tôi muốn chuyển đổi thành một chuỗi:

$res = true;

Tôi cần giá trị chuyển đổi phải ở định dạng : "true" "false", không"0" "1"

$converted_res = "true";
$converted_res = "false";

Tôi đã thử:

$converted_res = string($res);
$converted_res = String($res);

Nhưng nó cho tôi biết rằng stringStringkhông được công nhận chức năng.
Làm cách nào để chuyển đổi Boolean này thành một chuỗi theo định dạng "true"hoặc "false"trong PHP?


1
Hàm sử dụng mới hơn ((chuỗi) $ param [loại boolean]) {if ($ param) {....}} vì (chuỗi) false => "false" không sai ...
zloctb

Câu trả lời:


361

Giải pháp đơn giản nhất:

$converted_res = $res ? 'true' : 'false';


1
Đây là cách dễ nhất để làm điều đó, nhưng nó phụ thuộc vào những gì bạn cần vì nó có thể không phải là sự hờn dỗi tốt nhất.
Androm

1
@DoomStone Tôi biết đã 3 năm rồi, nhưng tôi chỉ muốn biết điều gì khiến bạn nghĩ trong một số trường hợp, đó không phải là giải pháp tốt nhất. Các ?:ký hiệu là mã đơn giản nhất mà chúng ta có thể đưa ra trong tình huống này.
caiosm1005

1
Ví dụ đối với tôi, nó không phải là giải pháp tốt nhất cho trường hợp hiện tại: tôi không chắc loại giá trị trả về là gì; nó có thể là boolean hoặc cái gì khác (Gọi một hàm mà người khác đã viết trong quá trình gỡ lỗi.) Giải pháp của bạn chuyển đổi $ res thành boolean, trong khi var_export có thể xử lý tất cả các loại có thể.

13
@ user2443147 loại boolean theo nghĩa đen là sự thật đầu tiên được đề cập trong câu hỏi. Nếu bạn không chắc chắn về loại bạn đang giải quyết, bạn có cả một loạt vấn đề khác để bắt đầu.
nem75

3
Lưu ý rằng bạn cần thêm dấu ngoặc khi bạn trộn toán tử ternary và nối chuỗi. echo '<active>' . $res ? 'true' : 'false' . '</active>';không tạo ra kết quả mong muốn, echo '<active>' . ($res ? 'true' : 'false') . '</active>';không.
Salman A

194

Hàm var_export trả về một chuỗi đại diện của một biến, vì vậy bạn có thể làm điều này:

var_export($res, true);

Đối số thứ hai cho biết hàm trả về chuỗi thay vì lặp lại chuỗi đó.


Câu trả lời hoàn hảo. Đây là cách "PHP" để có được "... một biểu diễn chuỗi có thể phân tích được của một biến"
peterchaula

61

Một cách khác để làm: json_encode( booleanValue )

echo json_encode(true);  // string "true"

echo json_encode(false); // string "false"

// null !== false
echo json_encode(null);  // string "null"

6
Tôi nghĩ rằng việc sử dụng theo ngữ nghĩavar_export() phù hợp hơn với mục đích của hoạt động (trừ khi người ta cần chuỗi cho một số JSON, nghĩa là ;-)
Adam Cameron

3
Điều này thực sự dựa vào hiệu ứng phụ rằng biểu diễn JSON xảy ra giống như những gì mong muốn. Nó cũng dựa vào phần mở rộng JSON được cài đặt và kích hoạt, có thể rất có thể nhưng không phải là một phần nhất định. Vì vậy, imho đây không phải là một giải pháp sạch.
Nick Rice

35

3
Xem câu trả lời của Christian để biết thêm chi tiết. Cụ thể, bao gồm đối số thứ hai (đúng).
Jimothy

Đây là câu trả lời "chỉ liên kết", không thực hiện hướng dẫn SO cho "Trả lời". Vui lòng editbao gồm thông tin liên quan từ liên kết vào bài viết của bạn. Mặc dù thông tin là hữu ích, nhưng nó được để lại một cách thích hợp hơn dưới dạng "Nhận xét" cho OP. Tất cả thông tin cần thiết từ liên kết phải được nhúng trong câu trả lời. 1) Nếu liên kết trở nên không thể truy cập, bài đăng này sẽ trở nên vô dụng. 2) khách truy cập không nên được yêu cầu truy cập các liên kết bên ngoài, chỉ để tìm ra nó. Điều đó nói rằng, liên kết đến tài liệu, nguồn hoặc thông tin bổ sung rất được khuyến khích. Cảm ơn sự đóng góp của bạn.
SherylHohman

12

Bạn sử dụng strval () hoặc (chuỗi) để chuyển đổi thành chuỗi trong PHP. Tuy nhiên, điều đó không chuyển đổi boolean thành chính tả thực sự của "true" hoặc "false" nên bạn phải tự mình làm điều đó. Đây là một chức năng ví dụ:

function strbool($value)
{
    return $value ? 'true' : 'false';
}
echo strbool(false); // "false"
echo strbool(true); // "true"

Nếu $val = true;sau đó strval($val)(string) $valcả hai quay lại 1.
ABach

9

Các giải pháp khác ở đây đều có sự cẩn thận (mặc dù chúng giải quyết câu hỏi trong tầm tay). Nếu bạn (1) lặp qua các loại hỗn hợp hoặc (2) muốn một giải pháp chung mà bạn có thể xuất dưới dạng hàm hoặc bao gồm trong các tiện ích của mình, thì không có giải pháp nào khác ở đây sẽ hoạt động.

Giải pháp đơn giản và tự giải thích nhất là:

// simplest, most-readable
if (is_bool($res) {
    $res = $res ? 'true' : 'false';
}

// same as above but written more tersely
$res = is_bool($res) ? ($res ? 'true' : 'false') : $res;

// Terser still, but completely unnecessary  function call and must be
// commented due to poor readability. What is var_export? What is its
// second arg? Why are we exporting stuff?
$res = is_bool($res) ? var_export($res, 1) : $res;

Nhưng hầu hết các nhà phát triển đọc mã của bạn sẽ yêu cầu một chuyến đi đến http://php.net/var_export để hiểu những gì var_exportlàm và thông số thứ hai là gì.

1. var_export

Hoạt động cho booleanđầu vào nhưng cũng chuyển đổi mọi thứ khác thành stringtốt.

// OK
var_export(false, 1); // 'false'
// OK
var_export(true, 1);  // 'true'
// NOT OK
var_export('', 1);  // '\'\''
// NOT OK
var_export(1, 1);  // '1'

2. ($res) ? 'true' : 'false';

Hoạt động cho đầu vào boolean nhưng chuyển đổi mọi thứ khác (ints, chuỗi) thành true / false.

// OK
true ? 'true' : 'false' // 'true'
// OK
false ? 'true' : 'false' // 'false'
// NOT OK
'' ? 'true' : 'false' // 'false'
// NOT OK
0 ? 'true' : 'false' // 'false'

3. json_encode()

Các vấn đề tương tự như var_exportvà có thể tồi tệ hơn vì json_encodekhông thể biết trueđược chuỗi có chủ đích là chuỗi hay boolean.


var_export()dường như là tốt nhất cho trường hợp sử dụng cụ thể, cảm ơn.
Tiến sĩ Gianluigi Zane Zanettini

Đối với các bản cài đặt PHP 5.5+, var_export(boolval($var), true)là một cách an toàn để chuyển đổi giá trị thành các chuỗi "đúng" hoặc "sai".
ngất xỉu

if (is_bool($res) { $res = $res ? 'true' : 'false'; } << điều này sẽ không hoạt động - thiếu ) có lẽ tốt hơn để sử dụng$result = (is_bool($var) && $var) ? 'true' : 'false';
mtizziani

@aleemb Điều gì về: $value = is_bool($value) ? var_export($value, true) : $value;Cách này tôi sống giá trị nguyên vẹn và chỉ thay đổi boolean thành biểu diễn chuỗi của họ.
Dickwan

Trong dòng mã đầu tiên của bạn, bạn có: $res = $res?? Ý bạn là $res == $ressao? Hoặc thậm chí : $res === $res?
SherylHohman

2

Tại sao không làm như thế này?:

if ($res) {
    $converted_res = "true";
}
else {
    $converted_res = "false";
}

2

Đối với tôi, tôi muốn một đại diện chuỗi trừ khi nó null, trong trường hợp đó tôi muốn nó vẫn còn null.

Vấn đề với var_export là nó chuyển đổi nullthành một chuỗi "NULL"và nó cũng chuyển đổi một chuỗi rỗng thành "''"không mong muốn. Không có giải pháp dễ dàng mà tôi có thể tìm thấy.

Đây là mã cuối cùng tôi đã sử dụng:

if (is_bool($val)) $val ? $val = "true" : $val = "false";
else if ($val !== null) $val = (string)$val;

Ngắn và đơn giản và dễ dàng để ném vào một chức năng quá nếu bạn thích.


1

boolval()hoạt động cho các bảng phức tạp nơi khai báo biến và thêm vòng lặp và bộ lọc không hoạt động. Thí dụ:

$result[$row['name'] . "</td><td>" . (boolval($row['special_case']) ? 'True' : 'False') . "</td><td>" . $row['more_fields'] = $tmp

trong đó $tmpmột khóa được sử dụng để hoán chuyển dữ liệu khác. Ở đây, tôi muốn bảng hiển thị "Có" cho 1 và không có gì cho 0, vì vậy được sử dụng (boolval($row['special_case']) ? 'Yes' : '').


1
Khi nào boolval(some_expression) ? .. : ..hành xử khác nhau hơn some_expression ? .. : ..?
ToolmakerSteve

1

Điều này cũng hoạt động cho bất kỳ loại giá trị:

$a = true;

echo $a                     // outputs:   1
echo value_To_String( $a )  // outputs:   true

mã:

function valueToString( $value ){ 
    return ( !is_bool( $value ) ?  $value : ($value ? 'true' : 'false' )  ); 
}

1

Được chỉnh sửa dựa trên đề xuất @ sebastian-norr chỉ ra rằng $boolbiến có thể có hoặc không đúng 0hoặc 1. Ví dụ, 2giải quyết truekhi chạy nó thông qua kiểm tra Boolean trong PHP.

Như một giải pháp, tôi đã sử dụng kiểu đúc để đảm bảo rằng chúng tôi chuyển đổi $boolsang 0hoặc 1.
Nhưng tôi phải thừa nhận rằng biểu thức đơn giản $bool ? 'true' : 'false'là cách sạch hơn.

Giải pháp của tôi được sử dụng dưới đây không bao giờ nên được sử dụng, LOL.
Đây là lý do tại sao không ...

Để tránh sự lặp lại, mảng chứa biểu diễn chuỗi của Boolean có thể được lưu trữ trong một hằng số có thể có sẵn trong toàn bộ ứng dụng.

// Make this constant available everywhere in the application
const BOOLEANS = ['true', 'false'];

$bool = true;
echo BOOLEANS[(bool)  $bool]; // 'true'
echo BOOLEANS[(bool) !$bool]; // 'false'

0

Tôi không phải là người hâm mộ của câu trả lời được chấp nhận vì nó chuyển đổi bất cứ điều gì đánh giá thành sai thành "false"không chỉ boolean và vis-ngược lại.

Dù sao đây là câu trả lời OTT của tôi, nó sử dụng var_exportchức năng.

var_exporthoạt động với tất cả các loại biến ngoại trừ resource, tôi đã tạo một hàm sẽ thực hiện chuyển đổi thông thường thành chuỗi ( (string)), ép kiểu nghiêm ngặt ( var_export) và kiểm tra loại, tùy thuộc vào các đối số được cung cấp ..

if(!function_exists('to_string')){

    function to_string($var, $strict = false, $expectedtype = null){

        if(!func_num_args()){
            return trigger_error(__FUNCTION__ . '() expects at least 1 parameter, 0 given', E_USER_WARNING);
        }
        if($expectedtype !== null  && gettype($var) !== $expectedtype){
            return trigger_error(__FUNCTION__ . '() expects parameter 1 to be ' . $expectedtype .', ' . gettype($var) . ' given', E_USER_WARNING);
        }
        if(is_string($var)){
            return $var;
        }
        if($strict && !is_resource($var)){
            return var_export($var, true);
        }
        return (string) $var;
    }
}

if(!function_exists('bool_to_string')){

    function bool_to_string($var){
        return func_num_args() ? to_string($var, true, 'boolean') : to_string();        
    }
}

if(!function_exists('object_to_string')){

    function object_to_string($var){
        return func_num_args() ? to_string($var, true, 'object') : to_string();        
    }
}

if(!function_exists('array_to_string')){

    function array_to_string($var){
        return func_num_args() ? to_string($var, true, 'array') : to_string();        
    }
}

0
$converted_res = isset ( $res ) ? ( $res ? 'true' : 'false' ) : 'false';

issetkhông cần thiết ở đây Trong php, if-test là sai cho cả nullvariable not defined. Có thể chỉ cần làm $converted_res = ( $res ? 'true' : 'false' );như đã thấy trong các câu trả lời cũ.
ToolmakerSteve

0
function ToStr($Val=null,$T=0){

    return is_string($Val)?"$Val"
    :
    (
        is_numeric($Val)?($T?"$Val":$Val)
        :
        (
            is_null($Val)?"NULL"
            :
            (
                is_bool($Val)?($Val?"TRUE":"FALSE")
                :
                (
                    is_array($Val)?@StrArr($Val,$T)
                    :
                    false
                )
            )
        )
    );

}
function StrArr($Arr,$T=0)
{
    $Str="";
    $i=-1;
    if(is_array($Arr))
    foreach($Arr AS $K => $V)
    $Str.=((++$i)?", ":null).(is_string($K)?"\"$K\"":$K)." => ".(is_string($V)?"\"$V\"":@ToStr($V,$T+1));
    return "array( ".($i?@ToStr($Arr):$Str)." )".($T?null:";");
}

$A = array(1,2,array('a'=>'b'),array('a','b','c'),true,false,ToStr(100));
echo StrArr($A); // OR ToStr($A) // OR ToStr(true) // OR StrArr(true)

-2

Chỉ muốn cập nhật, trong PHP> = 5,50 bạn có thể làm boolval()điều tương tự

Tham khảo tại đây .


3
Điều này giống như sử dụng(bool) $var;
Al.G.

Cảm ơn bạn! Điều này làm việc cho tôi trong một bảng phức tạp. Sử dụng nó như thế này:"<td>" . (boolval($row['special_case']) ? 'Yes' : ' ') . "</td>"
motorbaby

4
boolval()đi theo một cách khác, chuyển đổi một biến của bất kỳ loại nào thành bool, không phải bool thành chuỗi.
Mike Chamberlain
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.