NETCREATESBLOGネットクリエイツの公式ブログ

array_searchで0(ゼロ)が返ってくるとif文は?

私はプログラマというわけではないのですが、よく大学や高校の後輩からPHPという言語について尋ねられます。
最近、たまたま、それぞれ異なる後輩から同じ質問をされたのでちょっと紹介しておきたいと思いまして。
実は私も以前、はまったことが・・・

PHPには、配列の要素に特定の文字列が含まれているか検索するために、array_searchという関数が用意されています。
比較的よく使うのですが、int型の0(ゼロ)が返ってくる場合を考慮しないと失敗します。

例えば、$test_array = (“岡山”, “倉敷”, “津山”); の場合、
array_search(“倉敷”, $test_array); の結果は1 ですが、
array_search(“岡山”, $test_array); の結果は0 となります。

この0(ゼロ)が曲者でして、仮に配列に岡山が含まれているかどうか調べたいときに

if (array_search(“岡山”, $test_array)) echo “含まれています”;
else echo “含まれていません”;

なんて書いちゃうと「含まれていません」と表示されるのです・・・。
if文にとっては、int型の0も、boolean型のFALSEも、同じFALSEなのです。

というわけで、下記のように修正すると期待通りの結果を得られます。

if (array_search(“岡山”, $test_array) !== FALSE) echo “含まれています”;
else echo “含まれていません”;

=== は値が等しく、同じ型という比較演算子で、
!== は値が等しくないか、同じ型ではないという比較演算子です。

これならint型の0が返ってきたとしても、FALSEではないこと(「岡山」が含まれること)が判別可能です。

本当にちょっとしたことなのですが、頭の片隅に置いておくときっと助かる場面に遭遇します。
精進、精進。

トラックバック(0)

このブログ記事に対するトラックバックURL: https://netcreates.jp/blog/2008/09/array-search0if.html/trackback

コメント(2)

  1. array_search()はキーを返す関数だけど、in_array() は、配列の中に指定した値の有無のチェック。なので、中に入っているかどうかのチェックだけでよければ、array_search() よりも in_array() を使った方が混乱が少ないかも、です。


    Fatal error: Uncaught Error: Call to undefined function ereg() in /home/wb13305/www/netcreates.jp/blog/wp-content/themes/netcreates/functions.php:281 Stack trace: #0 /home/wb13305/www/netcreates.jp/blog/wp-content/themes/netcreates/comments.php(82): sandbox_commenter_link() #1 /home/wb13305/www/netcreates.jp/blog/wp-includes/comment-template.php(1513): require('/home/wb13305/w...') #2 /home/wb13305/www/netcreates.jp/blog/wp-content/themes/netcreates/single.php(47): comments_template() #3 /home/wb13305/www/netcreates.jp/blog/wp-includes/template-loader.php(98): include('/home/wb13305/w...') #4 /home/wb13305/www/netcreates.jp/blog/wp-blog-header.php(19): require_once('/home/wb13305/w...') #5 /home/wb13305/www/netcreates.jp/blog/index.php(17): require('/home/wb13305/w...') #6 {main} thrown in /home/wb13305/www/netcreates.jp/blog/wp-content/themes/netcreates/functions.php on line 281