PHPでは、0は空として扱われますか?


144

コードはさらに説明します:

$var = 0;

if (!empty($var)){
echo "Its not empty";
} else {
echo "Its empty";
}

結果は「Its empty」を返します。empty()が変数をすでに設定していて、内部に値があるかどうかをチェックすると思いました。なぜ「空」を返すのですか?


15
@stereo emptyはおそらく最も有用ですが、広く誤解されているPHP関数です。いつどのように使用するかを学びます。
だます

2
@stereo emptyは基本的にの略ですisset($var) && $var != falseemptyこれを使って足で自分を撃つには、非常に奇妙なことをしているに違いありません。; P
だます

@stereo 1)「矛盾」はどこにありますか?缶に書かれているように機能します。2)false「未定義の変数」エラーを引き起こさずに変数を大まかに比較しても意味がありませんか?まあ、これは絶対にしないと思います…3)セキュリティコンテキストで間違った関数を選択しても、関数自体が悪い、役に立たない、または一貫性がないというわけではありません。それは、誰かがその仕事のために間違った機能を選択したことを意味します。
だます


18
@deceze-関数がのように広く誤解されている場合empty()、その名前はおそらく間違っています。
martinstoeckli 2013年

回答:


189

http://php.net/empty

次のものは空と見なされます。

  • ""(空の文字列)
  • 0(0は整数)
  • 0.0(フロートとして0)
  • "0"(文字列として0)
  • ヌル
  • array()(空の配列)
  • var $ var; (宣言された変数ですが、クラスに値がありません)

これは、ブール型への型強制とまったく同じリストであることに注意してくださいfalseempty単に!isset($var) || !$varです。isset代わりに試してください。


だから、私はこのようにチェックする必要があります:if(isset($ var)&& $ var!= 0){何か} ??
mysqllearner 2010

1
@mysqlこの場合、を使用する!empty($var)こともできますが、それは質問で書いたものと同じではないことに注意してください。何を使用するかは、どの値をどのように見なしたいかに完全に依存しますtrue。ちょうど間の違いを比較issetしてempty、右のような状況のための適切な組み合わせを選択してください。
だます

7
@mysqllearner:ifをisset返します。しかし、あなたが何を意味するかは同じですTrue$var=0if(isset($var) && $var != 0)empty
Felix Kling

@mysqllearner issetは、空でないかどうかを検出します。空かどうかを確認するには、代わりに!issetを使用してください。

1
@Deji PHPはWeb言語としてのルーツを持ち、HTTPリクエストの値は常に文字列で'0'あるため、と同等に扱われ0ます。これは、PHPのコア設計哲学です。これは非常に議論の余地のある選択であることに同意しますが、私はあなたがその選択をあなたと議論するためにここにいるわけではありません。PHPのロジック内ではempty== falseマイナスの通知と同等のIMOを使用できます。PHPでは、いくつかの点で大きく異なる必要があるということは、別のトピックです。
だます

76

なぜ非常に便利なタイプ比較表を提案する人がいないのかと思っていました。一般的な関数に関するすべての質問に答え、演算子を比較します。

スニペット:

Expression      | empty($x)
----------------+--------
$x = "";        | true    
$x = null       | true    
var $x;         | true    
$x is undefined | true    
$x = array();   | true    
$x = false;     | true    
$x = true;      | false   
$x = 1;         | false   
$x = 42;        | false   
$x = 0;         | true    
$x = -1;        | false   
$x = "1";       | false   
$x = "0";       | true    
$x = "-1";      | false   
$x = "php";     | false   
$x = "true";    | false   
$x = "false";   | false   

他のチートシートと一緒に、わからない場合に備えて、常にこのテーブルのハードコピーを机に置いています。


2
チートシートを更新する必要があります。もう少しお話しします... 0.0 = true、0.00 = true、 "0.0" = false
Sayed Mohd Ali

34

数値の場合は、is_numeric関数を使用する必要があります。

$var = 0;

if (is_numeric($var))
{
  echo "Its not empty";
} 
else 
{
    echo "Its empty";
}

1
「0」または0に対してチェックする必要がある場合の
適切

12

strlen()代わりに使用してください。一部の変数の可能な値として1/0を使用して、同じ問題に遭遇しました。if (strlen($_POST['myValue']) == 0)変数に文字があるかどうかをテストするために使用しています。


@strlenを追加して、エラーログを省略します。念のため...大きなログを作成しないようにするには
Miguel

なぜあなたは置くでしょう@strlen。変数を渡す限り、エラーは出力されません。あなたのSTRLENは、それが0に値を記録します空の場合
sketchthat

2
変数が設定されていない場合、エラーが発生すると思います。
Evren Yurtesen 16

11

最近、これもパンツに引っかかってしまいました。私たちがよく扱う問題は、変数が設定されていないことです-存在しているかどうかはわからないかもしれませんが、多くの要素について0(または'0'、投稿をより正確に通過しますが、「false」として評価される文字列です) )は、ドロップダウンリストに表示される正当な値です。

次も使用する必要がある場合は、empty()最初に使用し、次に使用strlen()するのが最善です。

if(!empty($var) && strlen($var)){
    echo '"$var" is present and has a non-falsey value!';
}

6

言語の観点から見ると、価値なしという意味です。他の人のisset()ように、変数が定義されているかどうかを確認するために使用する必要があると言っています。


1
この単純な答えは、0null問題を簡単に解決するのに役立ちました。ありがとう!
Giacomo1968


4

変数の値として0を受け入れるには isset

変数が空かどうかを確認

$var = 0;

if ($var == '') {
    echo "empty";
} else {
    echo "not empty"; 
}
//output is empty

変数が設定されているかどうかを確認します

$var = 0;

if (isset($var)) {
    echo "not empty";
} else {    
    echo "empty";
}
//output is not empty

4

それは私のために働いています!

//
if(isset($_POST['post_var'])&&$_POST['post_var']!==''){
echo $_POST['post_var'];
}

//results:
1 if $_POST['post_var']='1'
0 if $_POST['post_var']='0'
skip if $_POST['post_var']=''

1

次のものは空と見なされます。

  • ""(空の文字列)
  • 0(0は整数)
  • "0"(文字列として0)
  • ヌル
  • array()(空の配列)
  • var $ var; (宣言された変数ですが、クラスに値がありません)

PHPマニュアルから

あなたの場合$var0なので、empty($var)戻りtrueます、テストする前に結果を否定しているので、elseブロックは実行さIts emptyれ、出力として" "を与えます。


1

マニュアルから:varに空ではなくゼロ以外の値がある場合は、FALSEを返します。

次のものは空と見なされます。

  • ""(空の文字列)
  • 0(0は整数)
  • "0"(文字列として0)NULL
  • FALSE array()(空の配列)var
  • $ var; (宣言された変数ですが、クラスに値がありません)

詳細:http : //php.net/manual/en/function.empty.php


1
if (empty($var) && $pieces[$var] != '0') {
//do something
}

私の場合、このコードは機能しました。


0

実際にissetは、変数が設定されているかどうかを確認するだけです。この場合、変数が本当にゼロか空かどうかを確認するには、次の例を使用できます。

$myVar = '';
if (empty($myVar))
{
  echo "Its empty";
}
echo "<br/>";

if ($myVar===0)
{
  echo "also zero!";
}

$ myVar == 0は空の関数のように振る舞います。


0

空とは空を意味します。

私がする時

$var = '';    
$var = '0';

私はそれvar_dump(empty($var));が偽を返すことを期待しています。

配列内のものをチェックする場合は、常にisset($var)最初に行う必要があります。



0

説明と解決策を探している人がまだいるかどうかはわかりません。上記のコメントは、TRUE / FALSE / 1/0の違いについてすべて述べてい
ます。実際の値を表示する方法として、2セントを持ち込みたいと思います。

ブール

ブールデータ型を使用している場合は、TRUEとFALSEの結果を探します。MySQLに保存すると、1つのrespとして保存されます。0(誤解しない限り、これはサーバーのメモリでも同じです)。

そのため、PHPで値を表示するには、値がtrue(1)またはfalse(0)であるかどうかを確認し、「TRUE」または「FALSE」または「1」または「0」のいずれかを表示する必要があります。
注意、0より大きい(または異なる)すべてもPHPではTRUEと見なされます。例:2、「abc」などはすべてTRUEを返します。

ビット、TINYINT

数値データ型を使用している場合、データの格納方法は同じです。
値を表示するには、PHPに数値として処理するように指示する必要があります。私が見つけた最も簡単な方法は、1を掛けることです。


0

適切な例。データベースにint型のフィールド(例:携帯電話番号)を作成し、フォームを使用して次のデータベースの空の値を送信するか、SQLを使用して挿入します。int型であり、空白またはnullとして保存できないため、データベース0に保存されるもの。したがって、それは空ですが、0として保存されます。そのため、PHPを介してデータをフェッチし、空の値を確認する場合。それは非常に便利で論理的に正しいです。

0.00、0.000、0.0000 .... 0.0 ... 0も空であり、上記の例は、float、double、decimal(decimalには0.000などのさまざまなバリアントがあるなど、データベースにさまざまなタイプの値を格納するためにも使用できます。


0

isset()を使用して、値が設定されているかどうかを確認する必要があります。


こんにちは@ Veershetty、Stack Overflowへようこそ。回答ありがとうございます。ただし、既存のより詳細な回答に新しいものは追加されていないようです。回答を編集して他の回答から欠落している詳細を追加するか、回答が新しくならない場合は回答を削除することを検討してください。
Gricey
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.