Jak przekonwertować wartość logiczną na ciąg

242

Mam zmienną logiczną, którą chcę przekonwertować na ciąg:

$res = true;

Potrzebuję przekonwertowanej wartości w formacie:, "true" "false"nie"0" "1"

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

Próbowałem:

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

Ale to mi mówi stringi Stringnie są rozpoznanymi funkcjami.
Jak przekonwertować wartość logiczną na ciąg znaków w formacie "true"lub "false"w PHP?

etykietka
źródło
1
Nowszy użycie funkcji ((string) $ param [Boolean typ]) {if ($ param) {....}} ponieważ (string) false => "false" nie jest fałszywy ...
zloctb

Odpowiedzi:

361

Najprostsze rozwiązanie:

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

hobodave
źródło
1
Jest to najłatwiejszy sposób na zrobienie tego, ale zależy to od tego, czego potrzebujesz, ponieważ może nie być najlepszym zanieczyszczeniem.
Androme
1
@DoomStone Wiem, że minęły 3 lata, ale chciałem tylko wiedzieć, co sprawia, że ​​w niektórych przypadkach nie jest to najlepsze rozwiązanie. ?:Notacja jest najbardziej uproszczony kod możemy wymyślić w tej sytuacji.
caiosm1005
1
Na przykład dla mnie nie jest to najlepsze rozwiązanie dla rozpatrywanej sprawy: nie jestem pewien, jaki jest typ zwracanej wartości; może być boolean lub coś innego. (Wywołanie funkcji, którą napisał ktoś inny podczas debugowania). Twoje rozwiązanie konwertuje $ res na wartość logiczną, podczas gdy var_export może obsłużyć wszystkie możliwe typy.
13
@ user2443147 typ logiczny to dosłownie pierwszy fakt wymieniony w pytaniu. Jeśli nie masz pewności, z jakim typem masz do czynienia, masz na początku cały szereg innych problemów.
nem75
3
Zauważ, że potrzebujesz dodatkowych nawiasów, aby połączyć operator trójskładnikowy i konkatenację łańcuchów. echo '<active>' . $res ? 'true' : 'false' . '</active>';nie daje pożądanego rezultatu, echo '<active>' . ($res ? 'true' : 'false') . '</active>';robi.
Salman A
194

Funkcja var_export zwraca ciąg reprezentujący zmienną, więc możesz to zrobić:

var_export($res, true);

Drugi argument mówi funkcji, aby zwracała ciąg zamiast go powtarzać.

Christian Davén
źródło
Idealna odpowiedź. Jest to „PHP” sposób na uzyskanie „... parsowalnej reprezentacji ciągu zmiennej”
peterchaula,
62

Kolejny sposób: json_encode( booleanValue )

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

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

// null !== false
echo json_encode(null);  // string "null"
Freez
źródło
6
Myślę, że użycie semantycznevar_export() jest bardziej zgodne z celem operacji (chyba że ktoś potrzebuje łańcucha dla jakiegoś JSON, to znaczy ;-)
Adam Cameron
3
To naprawdę zależy od efektu ubocznego, że reprezentacja JSON jest taka sama, jak jest pożądana. Zależy również od zainstalowania i włączenia rozszerzenia JSON, co może być bardzo prawdopodobne, ale nie jest dane. Więc imho, to nie jest czyste rozwiązanie.
Nick Rice,
35

Zobacz var_export

dev-null-dweller
źródło
3
Zobacz odpowiedź Christiana, aby uzyskać więcej szczegółów. W szczególności dołącz drugi argument (prawda).
Jimothy
To jest odpowiedź „tylko link”, która nie odpowiada wytycznym SO dla „odpowiedzi”. Do wiadomości należy editdołączyć odpowiednie informacje z linku. Chociaż informacja jest przydatna, bardziej trafnie pozostawia się ją jako „komentarz” do PO. Wszystkie niezbędne informacje z linku muszą być osadzone w odpowiedzi. 1) Gdyby link był nieosiągalny, ten post stałby się bezużyteczny. 2) odwiedzający nie powinni być zobowiązani do odwiedzania linków zewnętrznych, a jedynie do samodzielnego zrozumienia. To powiedziawszy, linki do dokumentacji, źródeł lub dodatkowych informacji są bardzo zalecane. Dziękuję za Twój wkład.
SherylHohman
12

Używasz strval () lub (string) do konwersji na ciąg znaków w PHP. Jednak to nie przekształca wartości logicznej w rzeczywistą pisownię „prawda” lub „fałsz”, więc musisz to zrobić samodzielnie. Oto przykładowa funkcja:

function strbool($value)
{
    return $value ? 'true' : 'false';
}
echo strbool(false); // "false"
echo strbool(true); // "true"
treznik
źródło
Jeśli $val = true;wtedy strval($val)i (string) $valoboje wrócą 1.
ABach
9

Wszystkie pozostałe rozwiązania mają tutaj pewne zastrzeżenia (choć odnoszą się do podanego pytania). Jeśli (1) zapętlasz mieszane typy lub (2) chcesz ogólnego rozwiązania, które możesz wyeksportować jako funkcję lub dołączyć do swoich narzędzi, żadne inne rozwiązanie tutaj nie będzie działać.

Najprostszym i najbardziej zrozumiałym rozwiązaniem jest:

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

Ale większość programistów czytających Twój kod będzie potrzebować podróży na http://php.net/var_export, aby zrozumieć, co var_exportrobi i jaki jest drugi parametr.

1. var_export

Działa na booleandane wejściowe, ale konwertuje także wszystko inne 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';

Działa dla danych logicznych, ale konwertuje wszystko inne (inty, ciągi znaków) na 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()

Te same problemy var_exporti prawdopodobnie gorsze, ponieważ json_encodenie można wiedzieć, czy ciąg truemiał być ciągiem, czy wartością logiczną.

aleemb
źródło
var_export()wydaje się być najlepszy dla konkretnego przypadku użycia, dzięki.
Dr. Gianluigi Zane Zanettini,
Dla instalacji PHP 5.5+ var_export(boolval($var), true)jest bezpieczną drogą do przekształcenia wartości na ciągi „prawda” lub „fałsz”.
faintsignal
if (is_bool($res) { $res = $res ? 'true' : 'false'; } << to nie zadziała - brak ) może być lepiej użyć$result = (is_bool($var) && $var) ? 'true' : 'false';
mtizziani
@aleemb Co z: W $value = is_bool($value) ? var_export($value, true) : $value;ten sposób żyję nienaruszoną wartością i zmieniam tylko wartość logiczną na ich ciąg znaków.
dickwan
W pierwszej linii kodu masz: $res = $res?? Czy miałeś na myśli $res == $res:? Albo nawet: $res === $res?
SherylHohman
2

Dlaczego po prostu tego nie robisz ?:

if ($res) {
    $converted_res = "true";
}
else {
    $converted_res = "false";
}
dobry wieczór
źródło
2

Dla mnie chciałem przedstawienia ciągów znaków, chyba że tak było null, w takim przypadku chciałem, aby pozostało null.

Problem z var_export polega na tym, że konwertuje nullon ciąg znaków, "NULL"a także konwertuje pusty ciąg znaków "''", co jest niepożądane. Nie mogłem znaleźć łatwego rozwiązania.

Oto kod, którego w końcu użyłem:

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

Krótkie, proste i łatwe do wprowadzenia, jeśli wolisz.

dallin
źródło
1

boolval()działa w przypadku skomplikowanych tabel, w których nie działają deklarowanie zmiennych oraz dodawanie pętli i filtrów. Przykład:

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

gdzie $tmpjest używany klucz do transpozycji innych danych. Tutaj chciałem, aby tabela wyświetlała „Tak” dla 1, a nic dla 0, więc używane (boolval($row['special_case']) ? 'Yes' : '').

motorbaby
źródło
1
Kiedy boolval(some_expression) ? .. : ..zachowuje się inaczej niż some_expression ? .. : ..?
ToolmakerSteve
1

Działa to również w przypadku dowolnej wartości:

$a = true;

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

kod:

function valueToString( $value ){ 
    return ( !is_bool( $value ) ?  $value : ($value ? 'true' : 'false' )  ); 
}
T.Todua
źródło
1

Edytowane na podstawie sugestii @ sebastian-norr, wskazując, że $boolzmienna może być, ale nie musi być prawdą 0lub 1. Na przykład 2rozwiązuje problem truepodczas uruchamiania go przez test boolowski w PHP.

Jako rozwiązanie zastosowałem rzutowanie typu, aby zapewnić konwersję $booldo 0lub 1.
Ale muszę przyznać, że proste wyrażenie $bool ? 'true' : 'false'jest o wiele czystsze.

Moje rozwiązanie zastosowane poniżej nigdy nie powinno być używane, LOL.
Oto dlaczego nie ...

Aby uniknąć powtórzeń, tablica zawierająca ciąg znaków wartości logicznej może być przechowywana w stałej, która może być dostępna w całej aplikacji.

// 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
źródło
0

Nie jestem fanem przyjętej odpowiedzi, ponieważ konwertuje wszystko, co daje w wyniku fałsz, na "false"nie tylko logiczne i odwrotnie.

W każdym razie oto moja odpowiedź OTT, używa var_exportfunkcji.

var_exportdziała ze wszystkimi typami zmiennych, z wyjątkiem tego resource, że utworzyłem funkcję, która będzie wykonywać regularne rzutowanie na string ( (string)), ścisłe rzutowanie ( var_export) i sprawdzanie typu, w zależności od podanych argumentów.

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
źródło
0
$converted_res = isset ( $res ) ? ( $res ? 'true' : 'false' ) : 'false';
MERT DOĞAN
źródło
issetnie jest to konieczne tutaj. W php if-test jest fałszywe zarówno dla, jak nulli dla variable not defined. Można po prostu zrobić, $converted_res = ( $res ? 'true' : 'false' );jak widać w starszych odpowiedziach.
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)
AbdulRahman AlShamiri
źródło
-2

Chciałem tylko zaktualizować, w PHP> = 5.50 możesz zrobić boolval()to samo

Odwołaj się tutaj .

Jesse
źródło
3
Jest to to samo, co przy użyciu(bool) $var;
Al.G.
Dziękuję Ci! To zadziałało dla mnie w skomplikowanym stole. "<td>" . (boolval($row['special_case']) ? 'Yes' : ' ') . "</td>"
Użyłem
4
boolval()idzie w drugą stronę, konwertując zmienną dowolnego typu na bool, a nie bool na string.
Mike Chamberlain