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


242

ฉันมีตัวแปรบูลีนที่ฉันต้องการแปลงเป็นสตริง:

$res = true;

ฉันต้องการค่าที่แปลงเป็นรูปแบบ: "true" "false"ไม่ใช่"0" "1"

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

ฉันพยายามแล้ว:

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

แต่มันบอกฉันว่าstringและStringไม่รู้จักฟังก์ชั่น
ฉันจะแปลงบูลีนนี้เป็นสตริงในรูปแบบ"true"หรือ"false"ใน PHP ได้อย่างไร


1
ฟังก์ชั่นการใช้งานใหม่ ((สตริง) $ param [ประเภทบูลีน]) {ถ้า ($ param) {.... }} เพราะ (สตริง) false => "false" ไม่ใช่เท็จ ...
zloctb

คำตอบ:


361

วิธีที่ง่ายที่สุด:

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


1
นี่เป็นวิธีที่ง่ายที่สุดในการทำ แต่มันขึ้นอยู่กับสิ่งที่คุณต้องการเพราะอาจไม่ใช่วิธีที่ดีที่สุด
Androme

1
@DoomStone ฉันรู้ว่า 3 ปีแล้ว แต่ฉันแค่อยากรู้ว่าอะไรทำให้คุณคิดว่าในบางกรณีมันไม่ใช่ทางออกที่ดีที่สุด ?:สัญกรณ์คือรหัสที่ง่ายที่สุดที่เราสามารถขึ้นมาในสถานการณ์เช่นนี้
caiosm1005

1
ยกตัวอย่างเช่นสำหรับฉันมันไม่ใช่ทางออกที่ดีที่สุดสำหรับคดีในมือ: ฉันไม่แน่ใจว่าประเภทของค่าตอบแทนคืออะไร; มันอาจจะเป็นบูลีนหรืออย่างอื่น (การเรียกฟังก์ชั่นที่คนอื่นเขียนระหว่างการดีบัก) โซลูชันของคุณแปลง $ res เป็นบูลีนในขณะที่ var_export สามารถจัดการกับประเภทที่เป็นไปได้ทั้งหมด

13
@ user2443147 ประเภทการบูลีนเป็นความจริงแรกที่กล่าวถึงในคำถาม หากคุณไม่แน่ใจเกี่ยวกับประเภทที่คุณกำลังเผชิญอยู่คุณมีปัญหาอื่น ๆ ที่จะเริ่มต้นด้วย
nem75

3
โปรดทราบว่าคุณต้องการวงเล็บพิเศษเมื่อคุณผสมตัวดำเนินการประกอบและการต่อสตริงเข้าด้วยกัน echo '<active>' . $res ? 'true' : 'false' . '</active>';ไม่ได้ผลิตผลลัพธ์ที่ต้องการ, echo '<active>' . ($res ? 'true' : 'false') . '</active>';ไม่
Salman

194

ฟังก์ชันvar_exportส่งคืนการแทนค่าสตริงของตัวแปรดังนั้นคุณสามารถทำได้ดังนี้:

var_export($res, true);

อาร์กิวเมนต์ที่สองบอกให้ฟังก์ชันส่งคืนสตริงแทนการสะท้อนกลับ


คำตอบที่สมบูรณ์แบบ นี่เป็นวิธี "PHP" ในการรับ "... การแทนค่าสตริงที่สามารถแยกวิเคราะห์ตัวแปรได้"
30919

62

วิธีอื่นในการทำ: json_encode( booleanValue )

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

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

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

6
ฉันคิดว่าการใช้ความหมายใช้var_export()ความตั้งใจมากขึ้นในการดำเนินการ (ยกเว้นกรณีที่จำเป็นต้องใช้สตริงสำหรับ JSON บางตัวนั่นคือ ;-)
Adam Cameron

3
สิ่งนี้ขึ้นอยู่กับผลข้างเคียงที่การเป็นตัวแทนของ JSON นั้นเหมือนกับสิ่งที่ต้องการ นอกจากนี้ยังขึ้นอยู่กับส่วนขยาย JSON ที่ติดตั้งและเปิดใช้งานซึ่งอาจเป็นไปได้มาก แต่ไม่ได้รับ ดังนั้น imho นี่ไม่ใช่ทางออกที่สะอาด
นิคไรซ์

35

ดูvar_export


3
ดูคำตอบของคริสเตียนสำหรับรายละเอียดเพิ่มเติม โดยเฉพาะรวมอาร์กิวเมนต์ที่สอง (จริง)
Jimothy

นี่คือคำตอบ "ลิงก์อย่างเดียว" ซึ่งไม่ได้ให้คำแนะนำแนวทางสำหรับ "คำตอบ" โปรดeditรวมข้อมูลที่เกี่ยวข้องจากลิงค์ในโพสต์ของคุณ ในขณะที่ข้อมูลนั้นมีประโยชน์มันก็ยังเหลืออยู่อย่างเหมาะสมในฐานะ "ความคิดเห็น" ของ OP ข้อมูลที่จำเป็นทั้งหมดจากลิงค์จะต้องฝังอยู่ในคำตอบ 1) หากลิงก์ไม่สามารถเข้าถึงได้โพสต์นี้จะไร้ประโยชน์ 2) ผู้เยี่ยมชมไม่จำเป็นต้องเยี่ยมชมลิงค์ภายนอกเพียงเพื่อจะได้รู้ว่าตัวเองทำอะไร ที่กล่าวว่าเชื่อมโยงไปยังเอกสารแหล่งที่มาหรือข้อมูลเพิ่มเติมได้รับการสนับสนุนอย่างมาก ขอบคุณสำหรับการสนับสนุนของคุณ
SherylHohman

12

คุณใช้ strval () หรือ (string) เพื่อแปลงเป็นสตริงใน PHP อย่างไรก็ตามนั่นไม่ได้แปลงบูลีนเป็นการสะกดที่แท้จริงของ "จริง" หรือ "เท็จ" ดังนั้นคุณต้องทำด้วยตัวเอง นี่คือฟังก์ชั่นตัวอย่าง:

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

ถ้าเช่น$val = true;นั้นstrval($val)และ(string) $valทั้งคู่กลับมา 1
ABach

9

โซลูชันอื่น ๆ ที่นี่ทั้งหมดมีข้อควรระวัง (แม้ว่าพวกเขาจะตอบคำถามในมือ) หากคุณ (1) วนลูปมากกว่าประเภทผสมหรือ (2) ต้องการโซลูชันทั่วไปที่คุณสามารถส่งออกเป็นฟังก์ชั่นหรือรวมอยู่ในยูทิลิตี้ของคุณไม่มีวิธีการแก้ปัญหาอื่น ๆ ที่นี่จะทำงาน

ทางออกที่ง่ายที่สุดและอธิบายตนเองได้มากที่สุดคือ:

// 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;

แต่นักพัฒนาซอฟต์แวร์ส่วนใหญ่ที่อ่านรหัสของคุณจะต้องเดินทางไปที่http://php.net/var_exportเพื่อทำความเข้าใจสิ่งที่var_exportทำและสิ่งที่พารามิเตอร์ที่สองคือ

1 var_export

ธิการสำหรับbooleanการป้อนข้อมูล แต่แปลงทุกอย่างอื่นไปstringได้เป็นอย่างดี

// 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';

ใช้งานได้กับอินพุตบูลีน แต่แปลงทุกอย่างอื่น (ints, สตริง) เป็นจริง / เท็จ

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

3 json_encode()

ปัญหาเดียวกันกับvar_exportและอาจแย่กว่านั้นเพราะjson_encodeไม่ทราบว่าสายอักขระtrueนั้นตั้งใจให้เป็นสายอักขระหรือบูลีน


var_export()น่าจะดีที่สุดสำหรับกรณีการใช้งานที่เฉพาะเจาะจงขอบคุณ
ดร. Gianluigi Zane Zanettini

สำหรับการติดตั้ง PHP 5.5+ var_export(boolval($var), true)เป็นเส้นทางที่ปลอดภัยในการแปลงค่าเป็นสตริง "true" หรือ "false"
faintsignal

if (is_bool($res) { $res = $res ? 'true' : 'false'; } << วิธีนี้ใช้ไม่ได้ผล - หายไป) อาจใช้งานได้ดีกว่า$result = (is_bool($var) && $var) ? 'true' : 'false';
mtizziani

@aleemb เกี่ยวกับ: $value = is_bool($value) ? var_export($value, true) : $value;วิธีนี้ฉันใช้ค่าที่ไม่เปลี่ยนแปลงและเปลี่ยนบูลีนเป็นการแสดงสตริงของพวกเขาเท่านั้น
dickwan

ในสายกำปั้นของคุณของรหัสที่คุณมี: $res = $res?? คุณหมายถึง: $res == $res? หรือแม้กระทั่ง: $res === $res?
SherylHohman


2

สำหรับผมผมอยากแสดงสตริงเว้นแต่จะเป็นในกรณีที่ฉันอยากให้มันยังคงอยู่nullnull

ปัญหาเกี่ยวกับ var_export คือมันจะแปลงnullเป็นสตริง"NULL"และยังแปลงสตริงว่าง"''"เป็นซึ่งไม่พึงประสงค์ ไม่มีทางออกที่ง่ายที่ฉันสามารถหาได้

นี่คือรหัสที่ฉันใช้ในที่สุด:

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

สั้นและง่ายและง่ายต่อการใช้งานหากคุณต้องการ


1

boolval()ทำงานสำหรับตารางที่ซับซ้อนซึ่งการประกาศตัวแปรและการเพิ่มลูปและตัวกรองไม่ทำงาน ตัวอย่าง:

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

โดยที่$tmpเป็นรหัสที่ใช้ในการเคลื่อนย้ายข้อมูลอื่น ที่นี่ผมอยากตารางเพื่อแสดง "ใช่" สำหรับ 1 และไม่มีอะไรที่ 0, (boolval($row['special_case']) ? 'Yes' : '')ใช้เพื่อ


1
เมื่อไหร่จะมีboolval(some_expression) ? .. : ..พฤติกรรมที่แตกต่างกว่าsome_expression ? .. : ..?
ToolmakerSteve

1

สิ่งนี้สามารถใช้ได้กับมูลค่าทุกประเภทด้วย:

$a = true;

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

รหัส:

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

1

แก้ไขขึ้นอยู่กับข้อเสนอแนะของเซบาสเตียน @-norr ชี้ให้เห็นว่า$boolตัวแปรที่อาจจะหรืออาจจะไม่ได้เป็นความจริงหรือ0 1ตัวอย่างเช่น2แก้ไขtrueเมื่อรันผ่านการทดสอบบูลีนใน PHP

เป็นวิธีแก้ปัญหาผมมีประเภทหล่อใช้เพื่อให้แน่ใจว่าเราแปลง$boolไปหรือ0 แต่ฉันต้องยอมรับว่าการแสดงออกอย่างเรียบง่ายนั้นดูดีกว่า 1
$bool ? 'true' : 'false'

โซลูชันของฉันที่ใช้ด้านล่างไม่ควรใช้ LOL
นี่คือเหตุผลที่ไม่ ...

เพื่อหลีกเลี่ยงการทำซ้ำอาร์เรย์ที่มีการแทนค่าสตริงของบูลีนสามารถเก็บไว้ในค่าคงที่สามารถใช้ได้ตลอดทั้งแอปพลิเคชัน

// 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

ฉันไม่ใช่แฟนของคำตอบที่ยอมรับเพราะมันแปลงอะไรที่ประเมินว่าผิดไป"false"ไม่ใช่แค่บูลีนและแบบกลับกัน

อย่างไรก็ตามนี่คือคำตอบ OTT ของฉันมันใช้var_exportฟังก์ชั่นนี้

var_exportทำงานได้กับตัวแปรทุกประเภทยกเว้นresourceฉันได้สร้างฟังก์ชั่นซึ่งจะทำการส่งแบบปกติไปยังสตริง ( (string)), การส่งแบบเข้มงวด ( var_export) และการตรวจสอบประเภทขึ้นอยู่กับอาร์กิวเมนต์ที่ให้ไว้ ..

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

issetไม่จำเป็นที่นี่ ใน PHP if-test เป็นเท็จสำหรับทั้งสองและnull variable not definedสามารถทำได้$converted_res = ( $res ? 'true' : 'false' );อย่างที่เห็นในคำตอบที่เก่ากว่า
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

แค่ต้องการอัปเดตในPHP> = 5.50คุณสามารถทำboolval()สิ่งเดียวกันได้

อ้างอิงที่นี่


3
นี่เหมือนกับการใช้(bool) $var;
อัลจี

ขอบคุณ! สิ่งนี้ใช้ได้กับฉันในตารางที่ซับซ้อน ใช้อย่างนี้:"<td>" . (boolval($row['special_case']) ? 'Yes' : ' ') . "</td>"
motorbaby

4
boolval()ไปทางอื่นแปลงตัวแปรชนิดใดก็ได้เป็นบูลไม่ใช่บูลเป็นสตริง
Mike Chamberlain
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.