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

netcreates. blogでタグ「PHP」が付けられているもの

IPv6なWindowsでgethostbyaddr()が使えない

わけあってIIS7でPHPを使おうと思いPHP Version 5.2.9-2のWindowsバイナリをダウンロードしてきて設定したのですが、gethostbyaddr()関数を使ったスクリプトで下記のエラーが出ることに気がつきました。

PHP Warning: gethostbyaddr() [function.gethostbyaddr]: Address is not in a.b.c.d form in・・・

引数が「a.b.c.d」という形式じゃないよというエラーなのですが、IPv6でアクセスしたのだから形式が異なって当然です。(IPv6アドレスはコロン(:)で区切りますからね。)

Read More »

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ではないこと(「岡山」が含まれること)が判別可能です。

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