Как преобразовать логическое значение в строку

243

У меня есть логическая переменная, которую я хочу преобразовать в строку:

$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) {....}}, потому что (строка) false => "false" не является ложным ...
zloctb

Ответы:

361

Самое простое решение:

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

hobodave
источник
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>';делает.
Салман А
195

Функция 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"
Freez
источник
6
Я думаю, что семантическое использование var_export()более соответствует цели операции (если только не требуется строка для некоторого JSON, то есть ;-)
Адам Кэмерон
3
Это действительно основывается на побочном эффекте, который заключается в том, что представление JSON совпадает с желаемым. Он также основан на установке и включении расширения JSON, что может быть очень вероятным, но это не само собой разумеющееся. Имхо, это не чистое решение.
Ник Райс
35

См. Var_export

DEV-нуль-обитатель
источник
3
Смотрите ответ Кристиана для более подробной информации. В частности, включите второй аргумент (true).
Джимоти
Это ответ «только для ссылок», который не отвечает требованиям SO для «Ответа». Пожалуйста, editвключите соответствующую информацию из ссылки в свой пост. Хотя эта информация полезна, ее более целесообразно оставить в качестве «комментария» к ФП. Вся необходимая информация по ссылке должна быть встроена в ответ. 1) Если ссылка станет недоступной, этот пост станет бесполезным. 2) посетители не должны посещать внешние ссылки, только чтобы сами это выяснить. Тем не менее, ссылки на документацию, источники или дополнительную информацию настоятельно рекомендуется. Спасибо за ваш вклад.
ШерилХоман
12

Вы используете strval () или (string) для преобразования в строку в PHP. Однако это не преобразует логическое значение в фактическое написание «true» или «false», поэтому вы должны сделать это самостоятельно. Вот пример функции:

function strbool($value)
{
    return $value ? 'true' : 'false';
}
echo strbool(false); // "false"
echo strbool(true); // "true"
treznik
источник
Если $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';

Работает для логического ввода, но преобразует все остальное (целые, строки) в 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предназначена для строки или логического значения.

aleemb
источник
var_export()кажется, лучше всего подходит для конкретного случая использования, спасибо.
Доктор Джанлуиджи Зане Занеттини
Для установок 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:?
ШерилХоман
2

Почему просто так не делают?

if ($res) {
    $converted_res = "true";
}
else {
    $converted_res = "false";
}
Добрый вечер
источник
2

Для меня я хотел строковое представление, если оно не было null, и в этом случае я хотел, чтобы оно осталось null.

Проблема с var_export заключается в том, что он преобразуется nullв строку, "NULL"а также в пустую строку "''", что нежелательно. Не было простого решения, которое я мог найти.

Это был код, который я наконец-то использовал:

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

Коротко и просто и легко добавить функцию, если вы предпочитаете.

Dallin
источник
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' : '').

motorbaby
источник
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' )  ); 
}
T.Todua
источник
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'
asiby
источник
0

Я не являюсь поклонником принятого ответа, поскольку он преобразует все, что оценивается как ложное, в "false"не просто логическое и наоборот.

В любом случае, вот мой ответ OTT, он использует var_exportфункцию.

var_exportработает со всеми типами переменных, за исключением того resource, что я создал функцию, которая будет выполнять обычное приведение к string ( (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();        
    }
}
TarranJones
источник
0
$converted_res = isset ( $res ) ? ( $res ? 'true' : 'false' ) : 'false';
MERT DOĞAN
источник
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 в string.
Майк Чемберлен