質問

PHP には、(int)0 および (string)"0" を空として評価する習慣があります。 empty() 関数。数値または文字列値が 0 であることが予想される場合、意図しない結果が生じる可能性があります。空のオブジェクト、配列、文​​字列などにのみ true を返すように「修正」するにはどうすればよいですか?

役に立ちましたか?

解決

これは私にはうまくいきませんでした。

if (empty($variable) && '0' != $variable) {
  // Do something
}

代わりに使用しました:

if (empty($variable) && strlen($variable) == 0) {
  // Do something
}

他のヒント

めったに使いません empty() あなたが説明した理由のためです。それは正当な価値観と空虚さを混同します。おそらく私は SQL で多くの作業を行っているからかもしれませんが、私は SQL を使用することを好みます。 NULL 値が存在しないことを示します。

PHPには関数がある is_null() 変数または式が以下であるかどうかをテストします。 NULL.

$foo = 0;
if (is_null($foo)) print "integer 0 is null!\n"; 
else print "integer 0 foo is not null!\n";

$foo = "0";
if (is_null($foo)) print "string '0' is null!\n"; 
else print "string '0' is not null!\n";

$foo = "";
if (is_null($foo)) print "string '' is null!\n"; 
else print "string '' is not null!\n";

$foo = false;
if (is_null($foo)) print "boolean false is null!\n"; 
else print "boolean false is not null!\n";

完全に等価演算子を使用することもできます === 同様のテストを行うには:

if ($foo === null) print "foo is null!\n";

これは真実です $fooNULL, 、ただし、そうでない場合はそうではありません false, 、 ゼロ、 "", 、など。

「0」は 常に偽とみなされます PHP では (または空) であり、これは非常に意味があります (ここでそれを主張するわけではありません)。ゼロも true に評価したい場合は、次を使用します。 strlen($value).

「直す」というのも一つの視点です。もう 1 つは、「壊れていない」と想定し、意図的に設計された方法で操作する方法を学ぶことです。

あなたが説明したような問題を考えると、最善の策は、変数が不定型状態にならないようにコードを強化することです。それ以外の場合は、gettype() を使用してデータ型をテストする必要があります。

私は常にコードベースに追加します

function is_blank($value) {
    return empty($value) && !is_numeric($value);
}

empty() の代わりにそれを使用してください。これにより、ゼロ (int、float、または string) を空でないものとして保持する問題が解決されます。

見る http://www.php.net/manual/en/function.empty.php#103756 2011 年 5 月に追加されました。

一般に、値が実際に null または false であるかどうかを判断するには、トリプル等号演算子を使用します。これはより具体的な結果です いつも 期待どおりに戻ります。

1 行のコードで実行できることを別の関数を作成して別の演算子を使用することは、非常に複雑になり、難読化がさらに追加されるように思えます。

さらに、多くのプログラマは、存在しない値を示すのに 0 または空の文字列を使用する傾向がありますが、実際には存在しない値 (型に関係なく) を示すには null 値を使用する方が正しい (そして、よりよい習慣であると感じます) -存在します。

私は空を検出するためにこれを使用します。

''  --> true
'0' --> false
0   --> false

関数:

function is_empty_or_zero($str) {
 return (is_null($str) || ($str === ''));
}

私が作成したのは、 IsEmpty() 簡潔なクイック機能。

function IsEmpty($mData) {
    return is_int($mData) ? false : 
        is_string($mData) ? $mData=="" : 
        empty($mData);
}

使おうとしているんですね empty() 意図されていないもののために。個人的には、この動作は PHP の古いプログラミング パラダイムから来ており、おそらく廃止される可能性があると考えています。

代わりに、チェックをより明確にします。値が役に立たないかどうかを確認するのではなく、有用であることを確認してください。たとえば、配列が必要な場合は、それが配列であることを確認します (is_array()) 文字列かどうかをチェックするのではなく。

また、すべてが $_POST そして $_GET 変数は文字列なので、「」と比較したり、 strlen() == 0.

if ( is_int($val) || !empty($val) ) {;}

私が使用した ord 渡された値が空かどうかをチェックする関数。

/*
* SPACE is not empty - Please do trim before using this function for your own purpose
*  var_dump(is_having_value(0));        // true
   var_dump(is_having_value(0000));     // true
   var_dump(is_having_value("    0"));  // true
   var_dump(is_having_value(""));       // false
   var_dump(is_having_value("  "));     // true
   var_dump(is_having_value('\t'));     // true
   var_dump(is_having_value(''));       // false
   var_dump(is_having_value('o'));      // true
   var_dump(is_having_value('O'));      // true
   var_dump(is_having_value('0'));      //true
   var_dump(is_having_value(null));     //false
   var_dump(is_having_value());         //false
*/
function is_having_value($val = null) {
    if (is_array($val) || is_object($val)):
        $logic_empty = empty($val);
        return !$logic_empty;
    else:
        $ascii = ord($val);
        if ($ascii == 48 || $ascii = 0 || $ascii == 32):
            return true;
        else:
            $logic_empty = empty($val);
            return !$logic_empty;
        endif;
    endif;
}

この問題に対する最も効果的な解決策は、変数が false かどうかをテストすることです。


if (!$variable_name) {echo $variable_name;}

変数が空か null かは関係なく、if 条件に入れるとすべて false になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top