Як перетворити булеву у струну


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 [булевий тип]) {if ($ param) {....}} тому, що (string) false => "false" не є хибною ...
zloctb

Відповіді:


361

Найпростіше рішення:

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


1
Це найпростіший спосіб зробити це, але це залежить від того, що вам потрібно для цього, можливо, це не найкращий розчин.
Андром

1
@DoomStone Я знаю, що минуло 3 роки, але я просто хотів знати, що змушує вас думати, що в деяких випадках це не найкраще рішення. ?:Позначення найбільш спрощений код можна придумати в цій ситуації.
caiosm1005

1
Наприклад, для мене це не найкраще рішення для конкретного випадку: я не впевнений, що таке тип повернутого значення; це може бути булевим чи чимось іншим. (Виклик функції, яку хтось інший написав під час налагодження.) Ваше рішення перетворює $ res в булеві, тоді як var_export може обробляти всі можливі типи.

13
@ user2443147 тип булевого типу - це буквально перший факт, згаданий у питанні. Якщо ви не впевнені в тому, з яким типом маєте справу, у вас є ще цілий набір проблем.
nem75

3
Зауважте, що вам потрібні додаткові дужки, коли ви змішуєте потрійний оператор і з'єднання рядків. echo '<active>' . $res ? 'true' : 'false' . '</active>';не дає бажаного результату, echo '<active>' . ($res ? 'true' : 'false') . '</active>';але.
Салман А

194

Функція var_export повертає рядкове представлення змінної, щоб ви могли це зробити:

var_export($res, true);

Другий аргумент вказує функції повернути рядок, а не повторювати її.


Ідеальна відповідь. Це "PHP" спосіб отримання "... парного представлення рядка змінної"
peterchaula

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, тобто ;-)
Адам Камерон

3
Це дійсно покладається на побічний ефект, який представляє JSON таким самим, як потрібний. Він також покладається на встановлення та включення розширення JSON, що може бути дуже ймовірним, але не є заданим. Тож імхо це не чисте рішення.
Нік Райс

35

Див. Var_export


3
Дивіться відповідь Крістіана для більш детальної інформації. Зокрема, включіть другий аргумент (вірно).
Джимофій

Це відповідь "лише для посилань", яка не змінює вказівки щодо "відповіді". Будь ласка, editдодайте відповідну інформацію за посиланням у свій пост. Хоча інформація є корисною, вона більш доречно залишається як "коментар" до ОП. Вся відповідна інформація за посиланням повинна бути вкладена у відповідь. 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, string) у 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()

Ті ж проблеми, що var_exportі, ймовірно, гірші, тому що json_encodeне можу знати, чи призначений рядок trueбув рядком або булевим.


var_export()здається, найкраще для конкретного випадку використання, дякую.
Доктор Джанлуїджі Зене Занеттіні

Для установок PHP 5.5+ var_export(boolval($var), true)- це безпечний шлях перетворення значення в рядки "true" або "false".
фансигнал

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:?
ШерілХоман


2

Для мене я хотів представлення рядків, якщо воно не було null, і в такому випадку я хотів, щоб воно залишилося null.

Проблема з 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

Відредаговано на основі пропозиції @ sebastian-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 ( (string)), строгий cast ( 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;
Al.G.

Дякую! Це працювало для мене в складній таблиці. Використовували це так:"<td>" . (boolval($row['special_case']) ? 'Yes' : ' ') . "</td>"
motorbaby

4
boolval()йде іншим шляхом, перетворюючи змінну будь-якого типу в bool, а не bool в рядок.
Майк Чемберлен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.