PHPで文字列をブール値に解析する


126

今日、私はPHPを使用していて、文字列値「true」と「false」が条件でブール値に正しく解析されないことを発見しました。たとえば、次の関数を検討します。

function isBoolean($value) {
   if ($value) {
      return true;
   } else {
      return false;
   }
}

私が実行すると:

isBoolean("true") // Returns true
isBoolean("") // Returns false
isBoolean("false") // Returns true, instead of false
isBoolean("asd") // Returns true, instead of false

「1」と「0」の値でのみ機能するようです。

isBoolean("1") // Returns true
isBoolean("0") // Returns false

「true」と「false」の文字列をブール値に解析するネイティブ関数はPHPにありますか?


コードでisBoolean("")は、falseを返す必要があります。
BoltClock

受け入れられた回答をエリック・キャロンの回答に変更することを検討する必要があります。それはあなたが尋ねることをするネイティブ関数を示します。
コードコマンダー

1
PHPは文字列が何を言っているかを考慮しません "false"は5文字だけで何も意味しません。ただし、これらは何かであるため、ブール値はtrue、人間の読者にとってはより直感的に見えると評価されFALSEます。
zeel

回答:


413

PHPのfilter_varメソッドを使用してこれを行うネイティブPHPメソッドがあります。

$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN);

PHPのマニュアルによると:

「1」、「true」、「on」、「yes」に対してTRUEを返します。それ以外の場合はFALSEを返します。

FILTER_NULL_ON_FAILUREが設定されている場合、「0」、「false」、「off」、「no」、および「」に対してのみFALSEが返され、ブール値以外の値に対してはNULLが返されます。


これは受け入れられるべき答えでした。組み込みのPHP関数は、独自の関数を作成するよりも優れています。車輪を再発明する必要はありません!残念ながら遅すぎました:P
casraf 2013年

1
比較のために値も小文字にしますか?
Mobiletainment 2013年

3
@Mobiletainment、はい-$ value(false、FALSE、FalSeなど)で想像できるすべての大文字小文字を処理します
Eric Caron

私の端にテストケースを持ち込んだ。比較のために===の代わりに==を使用しました。人々を混乱させないために私の以前のコメントを削除します。
andig

6
あなたは関数にフラグFILTER_NULL_ON_FAILUREを追加し、filter_var()それを置き換えない必要があるため、答えは油断しましたFILTER_VALIDATE_BOOLEAN。これは、私のためにトリックを実行した次のコードになります:$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)
Dragon54

14

その理由は、and (空の文字列)trueを除いて"0"、すべての文字列がブール値に変換されるときに評価されるためです""

次の関数は、正確に何をしたいでしょう:それはまさにPHPのように動作しますが、また、文字列を評価します"false"ようfalse

function isBoolean($value) {
   if ($value && strtolower($value) !== "false") {
      return true;
   } else {
      return false;
   }
}

ドキュメントはそれを説明しています:http : //php.net/manual/en/language.types.boolean.php

ブール値に変換する場合、次の値はFALSEと見なされます。

  • ブール値FALSE自体
  • 整数0(ゼロ)
  • float 0.0(ゼロ)
  • 空の文字列と文字列 "0"
  • 要素がゼロの配列
  • 特殊なタイプNULL(未設定の変数を含む)
  • 空のタグから作成されたSimpleXMLオブジェクト

他のすべての値はTRUE(リソースを含む)と見なされます。


2
+1いいね。(そこにstrtolowerをチャックすることができたが、それはそれについてである。)
John Parker

middaparkaはstrtolower($ value)を 'false'と比較することを意味したと思います。strtolowerにリテラル 'false'を渡すことは少し……ダフですか?:)
ポールディクソン、

@Paul Dixonうん、それは私が言っていたものです。:-)
ジョンパーカー、

2
@Marco-if($ value && strtolower($ value)!== "faux"){フランス語で作業している場合; if($ value && strtolower($ value)!== "falsch"){ドイツ語; if($ value && strtolower($ value)!== "onwaar"){オランダ語... PHPにこれが標準として組み込まれていない理由を理解できます
Mark Ba​​ker

1
空でない文字列はすべて、ブール値に変換するとtrueと評価されます。ただし、「0」を除く。
BoltClock

5

PHPのみで、"0"または空の文字列はfalseに強制されます。空でない他のすべての文字列は、trueに強制変換されます。マニュアルから:

ブール値に変換する場合、次の値が考慮されFALSEます。

  • 空の文字列と文字列 "0"

文字列"true"vs を処理するには、独自の関数を記述する必要があります"false"。ここでは、他のすべてのデフォルトはfalseであると想定しています。

function isBoolean($value) {
   if ($value === "true") {
      return true;
   } else {
      return false;
   }
}

簡単に凝縮できる余談

function isBoolean($value) {
   return $value === "true";
}

4

私は最近、(特に)質問しているような文字列を処理するための「ルーズ」なブール変換関数が必要でした。 私はいくつかの異なるアプローチを見つけ、それらを実行するための大量のテストデータを思い付きました。私のニーズに完全に合うものは何もないので、私は自分で書きました:

function loosely_cast_to_boolean($value) {
    if(is_array($value) || $value instanceof Countable) {
        return (boolean) count($value);
    } else if(is_string($value) || is_object($value) && method_exists($value, '__toString')) {
        $value = (string) $value;
        // see http://www.php.net/manual/en/filter.filters.validate.php#108218
        // see https://bugs.php.net/bug.php?id=49510
        $filtered = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
        if(!is_null($filtered)) {
            return $filtered;
        } else {
            // "none" gets special treatment to be consistent with ini file behavior.
            // see documentation in php.ini for more information, in part it says: 
            // "An empty string can be denoted by simply not writing anything after 
            // the equal sign, or by using the None keyword".
            if(strtolower($value) === 'none') {
                $value = '';
            }
            return (boolean) $value;
        }
    } else {
        return (boolean) $value;
    }
}

カウント可能で文字列キャスト可能であるオブジェクトの場合、これは文字列値よりもカウントを優先して真実性を判断します。つまり、$object instanceof Countableこれが次(boolean) count($object)の値に関係なく戻る場合(string) $object

ここで、使用したテストデータの動作と他のいくつかの関数の結果を確認できます。その小さなiframeからの結果をざっと見るのはちょっと難しいので、代わりにスクリプトの出力を全ページで表示できます(そのURLは文書化されていないため、これは永久に機能しない可能性があります)。それらのリンクがいつか死ぬ場合に備えて、私はペーストビンにもコードを載せました

「真実であるべき」とそうでないことの境界はかなり恣意的です。私が使用したデータは、私のニーズと美的好みに基づいて分類されています。


この機能は問題なく機能します。ありがとうございます。しかし、あなたのリンクは現在404ある
servermanfail

3

true他のほとんどの値が必要なので、文字列をブール値に変換するためにこの構成を使用しています。

$str = "true";
$bool = !in_array($str, array("false", "", "0", "no", "off"));

1

PHPに「true」と「false」の文字列をブール値に解析する関数はありますか?

いいえ-どちらも文字列であり、それらは(あなたの言うとおり)に評価されtrueます falsePHPでは空の文字列のみが評価されます。

これを手動でテストする必要があります。ただし、可能であれば、代わりに「実際の」ブール値を使用することをお勧めします。


1
すべての文字列trueがPHPで評価されるわけではありません。
coreyward、2011年

1
修正ではなく、明確にしただけです。「両方が文字列であり、[に評価するtrue]」と言うと、初心者に間違った印象を与える可能性があります。特に、文字列が文字列であり、ブール値に変換されているときに内容が重要ではない、より厳密な入力規則を持つ別の言語の場合(ルビー)。
coreyward、2011年

1
「PHPでは空の文字列のみがfalseと評価されます。」 しかし、空でない文字列は"0"どうですか?これも評価しfalseませんか?
2015

0

安全にブール値に変換する最も簡単な方法。

    $flag = 'true';

    if( filter_var( $flag,FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE ) !== null) {
      $flag = filter_var($flag,FILTER_VALIDATE_BOOLEAN);
    }

    gettype($flag); // Would Return 'Boolean'
    echo 'Val: '.$flag; // Would Output 'Val: 1'

0

APIが文字列「true」または「false」のみを受け入れ、それ以外nullすべてになる場合は、以下を試してください。

$boolean = ['true' => true, 'false' => false][$inputString] ?? null;

これは、$inputがオブジェクトではないことを前提としています。Null合体(??)はPHP 7.0で導入されました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.