34

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

4

13 に答える 13

43

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

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

代わりに使用しました:

if (empty($variable) && strlen($variable) == 0) {
  // Do something
}
于 2009-01-04T00:59:37.590 に答える
19

empty()あなたが説明した理由で私はめったに使用しません。正当な価値観と空虚さを混同します。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";

これは が の場合は true です$fooが、 、ゼロ、などNULLの場合は当てはまりません。false""

于 2009-01-03T22:52:26.380 に答える
8

PHP では、 「0」は常に false (または空) と見なされます。ゼロも true に評価する場合は、 を使用しますstrlen($value)

于 2009-01-03T23:03:04.440 に答える
6

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

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

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

2011 年 5 月に追加されたhttp://www.php.net/manual/en/function.empty.php#103756を参照してください。

于 2011-05-08T01:01:44.337 に答える
4

一般的に言えば、トリプル イコール演算子を使用して、値が本当に null か false かを判断します。これはより具体的であり、結果は常に期待どおりに正確に返されます。

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

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

于 2009-01-03T22:53:44.460 に答える
4

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

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

于 2009-01-03T22:35:10.223 に答える
1

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

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

$_POSTまた、すべての変数と変数が文字列であるという事実に依存$_GETできるため、「」と比較したり、それを確認したりできstrlen() == 0ます。

于 2009-01-05T06:23:58.340 に答える
1

これを使用して空を検出します。

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

関数:

function is_empty_or_zero($str) {
 return (is_null($str) || ($str === ''));
}
于 2016-04-05T08:37:30.117 に答える
0
if ( is_int($val) || !empty($val) ) {;}
于 2014-01-09T07:26:55.700 に答える
0

IsEmpty()簡潔なクイック関数を作成しました。

function IsEmpty($mData) {
    return is_int($mData) ? false : 
        is_string($mData) ? $mData=="" : 
        empty($mData);
}
于 2009-01-03T22:31:08.560 に答える
0

関数を使用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;
}
于 2016-05-06T03:40:41.447 に答える
-3

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


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

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

于 2009-01-03T23:22:35.883 に答える