変数が空の場合はPhp。 PHP のチートシート: FALSE、NULL、およびそれらに関連付けられた値。 If ステートメントで FALSE

変数文字列 (12)

文字列が空でない場合は true を返し、文字列が空の場合は false を返す関数 isNotEmpty があります。 空行を通すと機能しないことが分かりました。

Function isNotEmpty($input) ( $strTemp = $input; $strTemp = トリム($strTemp); if(strTemp != "") //これも試しました "if(strlen($strTemp) > 0)" ( return true ; ) false を返します ; )

文字列は isNotEmpty を使用してチェックされます。

If(isNotEmpty($userinput["phoneNumber"])) ( //電話番号を検証します ) else ( echo "電話番号が入力されていません
"; }

行が空の場合、それ以外の場合は実行されません。理由がわかりません。誰かがこれに光を当てることができますか。

答え

Serial_number というフィールドがあり、空のスペースがあるかどうかを確認したい場合

$シリアル番号 = トリム($_POST); $q="user_id="$_SESSION"" の製品から * を選択します。 $rs=mysql_query($q); while($row=mysql_fetch_assoc($rs))(if(empty($_POST["irons"]))( $irons=$row["product1"]; )

このようにして、別の空の関数を使用してループ内のすべてのループを反復処理できます。

さて、答える代わりに(あなたはすでに問題を解決していると思います)、いくつかのアドバイスをさせていただきます。

他の人はどうか知りませんが、私は個人的に次のようなものを見ると非常にイライラします。

もし(<>) ( true を返す; ) false を返す;

これにはエレガントな " return (<>); 」 常にコードを確認して、このロジックを削除してください。 のために それぞれこの状況では IF ステートメントは必要ありません。

型をチェックするための独自の is_string 関数と、長さをチェックするための strlen を書いているだけです。

関数 emptyStr($str) ( return is_string($str) && strlen($str) === 0; ) print emptyStr("") ? "空" : "空ではない"; // 空の

編集: トリム関数を使用して、文字列に含まれないかどうかを確認することもできます。

Is_string($str) && strlen(trim($str)) === 0;

PHP には empty() という組み込み関数があります。テストは if(empty($string))(...) と入力することで実行されます。 php.net link: php empty

答えはありますが、あなたの場合は次を使用できます

空を返します($input);

is_string($input) を返します。

単純な問題。 変化:

If(strTemp != "")

If($strTemp != "")

おそらく、次のように変更することもできます。

If($strTemp !== "")

!= "" は、数値 0 を渡した場合と、PHP の自動型変換によりその他のいくつかの場合に true を返します。

また、PHP にはすでに empty() 関数があることにも注意してください。

PHP は空の文字列を false に評価するため、次のように単純に使用できます。

If (trim($userinput["phoneNumber"])) ( // 電話番号を検証します ) else ( echo "電話番号が入力されていません
"; }

私は空の文字列をチェックするために常に正規表現を使用しています。これは Javascript だけでなく CGI/Perl の時代にまで遡ります。だから、たとえば (テストされていませんが) PHP を使用しないのはなぜでしょうか。

戻り preg_match("/\S/", $input);

\S はスペースを含まない任意の文字を表します

strlen() 関数を使用するだけです

If (strlen($s)) ( // 空ではない )

私も最近同じ質問を自分自身に問いました。
考えられる解決策はいくつかありますが、有効な解決策が 3 つあります。

  • s.indexOf(スターター) === 0
  • s.substr(0,starter.length) === スターター
  • s.lastIndexOf(starter, 0) === 0 (Mark Ba​​yerの回答を閲覧した後に追加)
  • ループを使用して:

    関数 startWith(s,starter) (for (var i = 0,cur_c; i< starter.length; i++) { cur_c = starter[i]; if (s[i] !== starter[i]) { return false; } } return true; }

ループを使用する後者の解決策にはまだ出会っていません。
驚くべきことに、このソリューションは最初の 3 つのソリューションよりも大幅に優れています。
この結論に達するために私が実行した jsperf テストは次のとおりです: http://jsperf.com/startswith2/2

ps: ecmascript 6 (harmony) では、文字列に対して独自の startWith メソッドが導入されています。
この非常に必要なメソッドを最初のバージョンに含めることを考えていたら、どれだけの時間を節約できただろうかと考えてください。

アップデート

Steve が組み込んだループの最適化が 2 つあることに注意してください。2 つのうち最初の方がパフォーマンスが向上したため、そのコードを以下に投稿します。

関数 startWith2(str, prefix) ( if (str.length< prefix.length) return false; for (var i = prefix.length - 1; (i >= 0) && (str[i] === prefix[i]); --i) 続行します。 私を返します< 0; }

最新のプログラミングは、長い間、型なし変数の操作に成功してきました。 変数の型は事前に指定することはできず、プログラムの実行中に変更できます。

この概念は、一般的なプログラミング パラダイムの中心となっています。 プログラミング時代の初期には、同じように徹底した信頼を持った言語では、プログラマーが変数を事前定義する必要があり、変数に違法なものが何も割り当てられないことが厳密に保証されていました。 プログラムもプログラミング言語も、変数が型を変更するということを以前はまったく知りませんでした。

空虚なものと存在しないものについて

PHP empty() 関数は isset() 関数の逆関数であり、いくつかの特別な使用方法の特徴があります。 変数がない場合、最初の関数は肯定的に応答し、その結果は true になりますが、2 番目の関数は否定的に応答し、その値は false になります。

定義上、 isset() は変数の存在をチェックするように設計されています。 変数が何をどのように割り当てられたかは問題ではありません。重要なのは、変数が存在し、unset() 関数によって破棄されないということです。 isset() 関数の結果は正の true になります。 $iVar = 0 の場合、次のことを覚えておくことが重要です。 この場合、isset($iVar) は true になりますが、empty($iVar) も true になります。

最初のケースでは、結果は変数が存在することを意味します。2 番目のケースでは、変数は空です。つまり、文字列 (「0」) または数値 (小数 - 0.0 または整数 - 0) は同じです。empty($iVar) は true になります。

セキュリティと管理について

実際にやってみると、型なし言語はプログラマーにより多くの自由を与えますが、アルゴリズムに取り組む彼の態度はより責任があると想定されています。

PHP は確立されたセマンティクスをサポートする最新の構文を提供しており、エラーはほとんどありませんが、細心の注意が必要です。 たとえば、関数を呼び出すには、特定の数のパラメータが必要です。

関数を呼び出すとき、すべてのパラメーターを渡す必要はまったくなく、パラメーターの重要な部分だけを渡すことができます。 この関数は、すべてのパラメータの有無をチェックする必要があります。 欠落しているもの、または値が正しくないものは、通常の形式に復元し、必要な値を割り当てる必要があります。

このコンテキストでは、PHP empty() 関数が不可欠です。 表現:

$a = "1;2" + 20

式の最初の部分は 1 として表され、2 番目の部分は 20 として表されるため、変数 $a に値 21 が割り当てられます。

結果は数値型になり、PHP 関数 empty($a) の結果は false、つまり変数 $a が空ではありません。

この文脈では、次のような機能があります。

funcTest($a = 0, $b = 20)

電話をかけるとき:

$res = funcTest($aVal, $bVal)

必要なもの、つまり関数の結果が得られます。 そして、呼び出されたとき:

  • $res = funcTest($aVal.$bVal)

関数本体には、値「$aVal . $bVal」を持つパラメーターが 1 つだけ含まれており、おそらくこのパラメーターは文字列として解釈されます。

オブジェクトと配列の PHP empty()

言語構文には、オブジェクトや配列を操作するための十分な数の構造体や関数がありますが、それらの存在と値の存在をチェックするという観点からは、変数と特別な違いはありません。

PHP 空 (配列) - 空 (単純な変数) を呼び出すのと同じです。 ただし、オブジェクトに関しては非常に重要な考慮事項があります。 オブジェクトの存在 (isset) を確認することに関しては、この質問はほとんど意味がありません。 PHP の empty() 関数に関しては、その使用の妥当性には疑問が残ります。

オブジェクト指向プログラミングのロジックによれば、オブジェクトには独自のコンテンツと独自のメソッドのセットがあります。 オブジェクト自体が空か空ではないかを判断できるのはオブジェクト自体だけですが、たとえそれが言語の構文の一部であっても、サードパーティ関数は判断できません。

オブジェクトとその関数 empty()

この単純だが正当な根拠に基づいて、すべてのオブジェクトは「空」の理解という文脈で考慮される必要があります。 たとえば、「スタッフィング テーブル」オブジェクトの実装は、「従業員」レコードで構成されます。 ただし、従業員が 1 人もいない場合は、「スタッフ配置リスト」に潜在的な従業員のポジションの選択肢が常に表示されます。

ここで PHP の空のオブジェクト関数をどのレベルで使用する必要がありますか? 「スタッフィング」レベルでは、従業員が 1 人もいない場合でも、すべてが存在します。 「従業員」レベルでは、完全に埋められていない場合でも、オブジェクトはすでに存在します。 完全に塗りつぶされていないオブジェクトは、空のオブジェクトとして分類できます。 人員配置には何のメリットもありません。

プログラミング スタイルによっては、PHP 関数 empty() と isset() は、安全で信頼性の高いアルゴリズムを構築するために非常に重要ですが、オブジェクトの場合は、そのコンテンツによって定義された empty() のバリアントを使用する方がさらに良いでしょう。

PHP では、FALSE と NULL の値、およびそれらに関連付けられた値は、他の言語での通常の値とは異なり、独自の非自明な機能があります。
この記事ではこれらの機能について説明します。
初心者にとっては全体像を把握するのに役立ちますが、経験豊富な読者にとっては、ニュアンスが忘れてしまった場合に記憶をリフレッシュするのに役立ちます。

If ステートメントで FALSE

PHP ドキュメントによると、ブール値にキャストした後の次の値は FALSE になります。
  • ブール値自体は FALSE です
  • 空の文字列 ("") と文字列 "0"。
  • 空の配列 (配列) – array()。
  • メンバー変数がゼロのオブジェクト (PHP 4 のみ、この記事では取り上げません)
  • 特別な NULL 値 (未設定の変数を含む)
  • SimpleXML オブジェクト (この記事では取り上げません)
これは、そのような値が条件に渡された場合:
if (…) echo "1"; それ以外の場合は「0」をエコーし​​ます。
文字列「0」が出力されます。

変数の値が設定されていない (未設定) 場合、警告が発行される場合もあります。 条件内の警告は、変数の前に @ を書くことで削除できることに注意してください。

例えば:

If (@$undefVar) ( …)
ただし、@ を使用するのは、慎重に考えた結果、他に適切なオプションがない場合など、極端な場合にのみ使用してください。 isset() 関数を参照してください。

is_null() 関数と言語構成要素 isset() および empty()

is_null() は、値が割り当てられていない変数、または値 NULL が割り当てられている変数に対してのみ TRUE を返します。
isset() は、 is_null() と比較して 1 対 1 のブール値を返します。
変数に値が割り当てられていない場合、警告を発行しない isset() とは異なり、 is_null() は「未定義変数」の警告も発行します。
変数の値を削除するには、unset() 関数を使用できることを思い出してください。 この目的で値 NULL を割り当てて、変数の値を読み取ろうとするときのコンパイラ警告を回避することもできます。

変数とは異なり、定数を操作するには、define() コンストラクトを使用する必要があることに注意してください。

文字列表現

false 定数の文字列表現を見てみましょう。
たとえば、以下の表に示すように、連結により値が次の文字列に変換されます。

文字列への変換のトピックについては、公式 Web サイトの「文字列への変換」の項で詳しく説明されています。

比較演算子

比較演算子に移りましょう。
「 == 」演算子を使用して FALSE と比較すると、すべての false 値は期待どおり true を返します。
ただし、偽の文字列定数を相互に比較する場合は、推移性に依存しないでください。
以下に、偽の値を比較するための完全な表を示します (プラスは、「 != 」演算子を使用して比較した場合に真の値を返す表要素を示します)。

$undef – 値が割り当てられていない変数

この表からいくつかの楽しい結論を導き出すことができます。
1. 文字列のみを使用することがわかっている場合は、文字列を安全に比較でき、「" (空の文字列) が「0」に等しいかどうかを心配する必要はありません。
2. 配列は、文字列、整数、または実数と等しくなりません。

false 定数の型は異なるため、演算子 === と !== のペアを使用してそれらを区別できます。
=== 演算子は、すべての false 値のペアに対して false を返します。
引数の 1 つに値 NULL が割り当てられ、2 番目には値が割り当てられていない引数に対してのみ true 値を返します。

NULL値を持つ変数と未定義変数の違い

=== 演算子を使用すると、値が割り当てられていない変数と NULL 値を持つ変数を除く、すべての false 値を区別できます。

このような変数は、get_define_vars() 関数を使用して区別できます。

$var 変数に値が割り当てられているかどうかを確認する必要がある場合は、次のコード スニペットを使用してこれを行うことができます。
if (array_key_exists("var", get_define_vars())) ( echo "var は定義されています"; // $var には NULL が割り当てられます ) else ( echo "var は定義されていません"; // $var は定義されていない、または unset($ var) が呼び出されました)

結論

PHP では、2 つの false 値が互いに等しくない場合があり、一見異なるように見える変数が比較す​​ると同じであることが判明する場合があることを常に覚えておく必要があります。 このような予期せぬ事態を避けるために、=== 演算子と !== 演算子を使用できます。

配列を操作する場合、予期せぬ事態を避けるために、値を保証された別のインデックスに変換する関数を作成できます。 その後、配列の要素にはそれを使用してのみアクセスできます。 これによりプログラムの速度が低下する可能性がありますが、予期せぬ事態を避けるのに役立ちます。

テストは PHP 5.3.1 で実行されました。

追加リンク

1. PHP タイプの比較表。
2. PHP のコンテキストにおける MySQl の Null 文字列と空の文字列。

タグ: タグを追加する

PHP では、FALSE と NULL の値、およびそれらに関連付けられた値は、他の言語での通常の値とは異なり、独自の非自明な機能があります。
この記事ではこれらの機能について説明します。
初心者にとっては全体像を把握するのに役立ちますが、経験豊富な読者にとっては、ニュアンスが忘れてしまった場合に記憶をリフレッシュするのに役立ちます。

If ステートメントで FALSE

PHP ドキュメントによると、ブール値にキャストした後の次の値は FALSE になります。
  • ブール値自体は FALSE です
  • 空の文字列 ("") と文字列 "0"。
  • 空の配列 (配列) – array()。
  • メンバー変数がゼロのオブジェクト (PHP 4 のみ、この記事では取り上げません)
  • 特別な NULL 値 (未設定の変数を含む)
  • SimpleXML オブジェクト (この記事では取り上げません)
これは、そのような値が条件に渡された場合:
if (…) echo "1"; それ以外の場合は「0」をエコーし​​ます。
文字列「0」が出力されます。

変数の値が設定されていない (未設定) 場合、警告が発行される場合もあります。 条件内の警告は、変数の前に @ を書くことで削除できることに注意してください。

例えば:

If (@$undefVar) ( …)
ただし、@ を使用するのは、慎重に考えた結果、他に適切なオプションがない場合など、極端な場合にのみ使用してください。 isset() 関数を参照してください。

is_null() 関数と言語構成要素 isset() および empty()

is_null() は、値が割り当てられていない変数、または値 NULL が割り当てられている変数に対してのみ TRUE を返します。
isset() は、 is_null() と比較して 1 対 1 のブール値を返します。
変数に値が割り当てられていない場合、警告を発行しない isset() とは異なり、 is_null() は「未定義変数」の警告も発行します。
変数の値を削除するには、unset() 関数を使用できることを思い出してください。 この目的で値 NULL を割り当てて、変数の値を読み取ろうとするときのコンパイラ警告を回避することもできます。

変数とは異なり、定数を操作するには、define() コンストラクトを使用する必要があることに注意してください。

文字列表現

false 定数の文字列表現を見てみましょう。
たとえば、以下の表に示すように、連結により値が次の文字列に変換されます。

文字列への変換のトピックについては、公式 Web サイトの「文字列への変換」の項で詳しく説明されています。

比較演算子

比較演算子に移りましょう。
「 == 」演算子を使用して FALSE と比較すると、すべての false 値は期待どおり true を返します。
ただし、偽の文字列定数を相互に比較する場合は、推移性に依存しないでください。
以下に、偽の値を比較するための完全な表を示します (プラスは、「 != 」演算子を使用して比較した場合に真の値を返す表要素を示します)。

$undef – 値が割り当てられていない変数

この表からいくつかの楽しい結論を導き出すことができます。
1. 文字列のみを使用することがわかっている場合は、文字列を安全に比較でき、「" (空の文字列) が「0」に等しいかどうかを心配する必要はありません。
2. 配列は、文字列、整数、または実数と等しくなりません。

false 定数の型は異なるため、演算子 === と !== のペアを使用してそれらを区別できます。
=== 演算子は、すべての false 値のペアに対して false を返します。
引数の 1 つに値 NULL が割り当てられ、2 番目には値が割り当てられていない引数に対してのみ true 値を返します。

NULL値を持つ変数と未定義変数の違い

=== 演算子を使用すると、値が割り当てられていない変数と NULL 値を持つ変数を除く、すべての false 値を区別できます。

このような変数は、get_define_vars() 関数を使用して区別できます。

$var 変数に値が割り当てられているかどうかを確認する必要がある場合は、次のコード スニペットを使用してこれを行うことができます。
if (array_key_exists("var", get_define_vars())) ( echo "var は定義されています"; // $var には NULL が割り当てられます ) else ( echo "var は定義されていません"; // $var は定義されていない、または unset($ var) が呼び出されました)

結論

PHP では、2 つの false 値が互いに等しくない場合があり、一見異なるように見える変数が比較す​​ると同じであることが判明する場合があることを常に覚えておく必要があります。 このような予期せぬ事態を避けるために、=== 演算子と !== 演算子を使用できます。

配列を操作する場合、予期せぬ事態を避けるために、値を保証された別のインデックスに変換する関数を作成できます。 その後、配列の要素にはそれを使用してのみアクセスできます。 これによりプログラムの速度が低下する可能性がありますが、予期せぬ事態を避けるのに役立ちます。

文字列を扱うときに、文字列が空かどうかを確認する必要がある場合、初心者プログラマーは通常、この関数を使用します。 strlen()。 この関数は、計算をまったく実行せず、zval で利用可能な既知の文字列長の値を返すだけなので、非常に高速です (PHP は変数の保存に C 構造体を使用します)。 しかし、それでも、なぜなら、 strlen()- これは関数ですが、呼び出すときに小文字への変換やハッシュ テーブルの検索など、いくつかのアクションが必要なため、少し遅くなります。 場合によっては、次を使用してコードの実行速度を向上させることができます。 空の()...、 だけでなく 空の()まだ少し最適化することができます。

例を挙げてみましょう例えば 画像パスの確認の場合、関数はパスが空かどうかを確認し、それを別のパス (たとえば「images/noimage.jpg」) に置き換えます。

したがって、タスク全体は、文字列型の変数が空かどうかをチェックすることに要約されます。 4つの方法を試してみましょう:

  • if(strlen($img_path)>0)
  • if($img_path(0))
  • if(空($img_path))
  • 最後にもう一つ方法があります。

したがって、最初の方法で書きます。

関数 check_image_path($img_path ) ( if (strlen ($img_path ) >0 ) ( $img_path = "images/noimage.jpg" ; ) return $img_path ; )

テストを実行しましょう。平均テスト時間はかかりました 1.43795800209

もう少し考えてみると…行全体ではなく、行の最初の文字に一度にアクセスできます。 最初の文字が存在する場合、文字列は空ではありません。 行の最初の文字には「0」の番号が付けられます。

関数 check_image_path($img_path) ( if ($img_path ( 0 ) ) ( $img_path = "images/noimage.jpg" ; ) return $img_path ; )

かかった平均テスト時間 1.19431300163 秒、プレイ時間の 17%

今度は empty() を使用して書き込んでみましょう。

関数 check_image_path($img_path) ( if (empty ($img_path) ) ( $img_path = "images/noimage.jpg" ; ) return $img_path ; )

かかった平均テスト時間 1.1341319084 秒、前の例の再生時間の 5%

次に、上記の最後から 2 番目と最後の例を見てみましょう。 これをどのように組み合わせることができるかを見てみましょう。 考えてみてください...他にどのように最適化できるでしょうか?

関数 check_image_path($img_path) ( if (empty ($img_path ( 0 ) ) ) ( $img_path = "images/noimage.jpg" ; ) return $img_path ; )

かかった平均テスト時間 1.07465314865 秒、そして再び 5% の確率で勝ちました...

それはどのように機能し、なぜ速いのでしょうか? そしてここ $img_path(0)最初の文字を返し、次に関数を返します 空の()空の文字列をチェックします...前の例との違いは、文字列全体ではなく 1 文字だけが関数に渡されることです。 したがって、最初の例から最後の例まで、私たちは勝ちました 25% 時間。