2011-01-23 25 views
89

今日、私はPHPで遊んでいましたが、文字列値 "true"と "false"は、たとえば次の関数を考慮して、ブール値に正しく解析されませんでした。PHPで文字列をブール値に構文解析する

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にネイティブ関数がありますか?

+0

あなたのコードでは、 'isBoolean(" ")'はfalseを返さなければなりません。 – BoltClock

+0

@BoltClock updated、thx – Mark

+0

受け入れられた答えをEric Caronの答えに変更することを検討する必要があります。それはあなたが求めるものを行うネイティブ関数を示しています。 –

答えて

306

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

は、 PHPのマニュアルによると
$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN); 

: "1" のための

trueを返し、 "真"、 "オン" と「Y 「es」。そうでなければFALSEを返します。

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

+0

これは受け入れられた回答であったはずです。 PHP関数でビルドするのは、独自のビルドよりも優れています。ホイールを再発明する必要はありません!あまりにも遅すぎました.P – casraf

+0

比較の値も小文字ですか? – Mobiletainment

+2

@Mobileeting、yes - あなたは$ value(false、FALSE、FalSeなど)について想像できるどんなケーシングも処理します。 –

12

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

次の関数は、正確に何をしたいでしょう:それはまさにPHPのように動作しますが、falseとしても、文字列"false"を評価します:http://php.net/manual/en/language.types.boolean.php::ドキュメントがあることを説明し

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

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

  • ブールFALSE自体
  • 整数0(ゼロ)
  • フロート0.0(ゼロ)
  • ゼロ要素
  • と空の文字列、および文字列"0"
  • アレイ空のタグから作成
  • のSimpleXMLオブジェクト(未設定の変数を含む)、特殊な型NULL

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

+1

+1ニース。 (そこにstrtolowerをチャックすることができますが、それについてです。) –

+0

middaparkaはstrtolower($ value)と 'false'を比較することを意味していたと思います。リテラルな「偽」をstrtolowerに渡すのはちょっと....大雑把ですか? :) –

+0

@Paul Dixon Yup、それは私が言及したものです。 :-) –

4

PHPでは、"0"または空の文字列がfalseに強制されます。他のすべての空でない文字列は真になる。

booleanに変換する場合、次の値がFALSEと考えられている:manualから

  • 空の文字列、およびあなたが書く必要がある文字列 "0"

文字列を扱う独自の関数"true""false"。ここで、私はfalseに他のすべてのデフォルトを想定しています

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

簡単

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

に凝縮することができサイドノートでは、「真」と「偽解析するPHPの関数があります"ブール値に文字列?

いいえ - 両方とも文字列であり、両方とも(あなたが言うように)trueと評価されます。空の文字列はPHPでfalseと評価されます。

これは手動でテストする必要があります。しかし、可能な限り、代わりに "真の"ブール値で作業するほうがよいでしょう。

+1

PHPではすべての文字列が 'true'と評価されるわけではありません。 – coreyward

+1

訂正していない、明らかにしています。 「両方とも文字列であると評価すると、真であると評価する」とは初心者に間違った印象を与える可能性があります。特に、文字列が文字列であり、内容が文字列であり、内容がブール値(Rubyのような)。 – coreyward

+1

@coreyフェア十分、良い点。 –

3

あなたが他のほとんどの値についてtrueをしたいので、私は、ブール値に文字列をモーフィングするために、この構文を使用しています:

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

私は最近、あなたが尋ねているような文字列(とりわけ)を扱うために、 "緩い"ブール変換関数が必要でした。 I found a few different approaches and came up with a big set of test data to run through them。可算と文字列キャスト可能の両方であるオブジェクトのために、これはtruthinessを決定するために、文字列値の上に数を優先することを

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の場合、これは(string) $objectの値にかかわらず(boolean) count($object)を返します。

私が使用したテストデータの動作と、他のいくつかの機能の結果が表示されますhere。小さなiframeの結果を見て回るのは難しいですから、代わりにview the script output in a full page(そのURLは文書化されていないので永遠に動作しないかもしれません)です。それらのリンクがある日に死ぬ場合には、I put the code up on pastebinも同様です。

"真実であるべき"と "間違っている"との間の線はかなり恣意的です。私が使用したデータは、私のニーズと美的好みに基づいて分類されていますが、あなたとは異なる場合があります。

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'