Scribble at 2024-04-09 15:51:42 Last modified: 2024-04-09 18:45:39

添付画像

PHP の関数というか言語仕様には、他の言語と同じく妙な決まりがあって、やはり正確に理解したり丁寧に扱わないと、余計なバッド・ノウハウを積み上げる暇や手間がかかってしまう。

典型的なのが、array_search() という関数だ。これは array に haystack を見つけたら、見つけた最初の配列のキーを返すというもので、公式のドキュメントには「それ以外の場合に false を返しますとだけ書いてあって、そのすぐ下には「false として評価される値を返す可能性もあります」とある。実例として、非常に簡単なコードを上に挙げておいた。

要素が "test" という文字列一つだけの配列 $a を定めて、その中に "test" という文字列を検索する。これだけなら、条件判定して "match" と表示されるかのように思いたくなるが、そうではない。なぜなら、この配列には要素が一つだけなので、調べるべき要素のキーは 0 だからだ。そして、PHP では 0 を単独の値としては false と解釈するため、この条件判定は偽として処理されるわけである。すると、次に考えつくのは、array_serach() の検索が成功したら true なのだから、

array_search( 'test', $a )

ではなく、

array_search( 'test', $a ) === true

と厳密にブール値として扱えばいいんじゃないかというものだ。でも、これもだめである。array_search( 'test', $a ) が int(0) として評価されるので、厳密な比較をすれば逆効果となってしまうからだ(整数値はブール値と比較できない)。つまり、

array_search( 'test', $a ) !== false

のようにしないと、正確に判定できないわけである。この場合だと、array_search( 'test', $a ) が int(0) と判定されるため、整数なら 0 でも 9 でも厳密に比較すれば偽であるから、その逆を取って真となるし、本当にブール値として false なら、false !== false は真の逆で偽となり、意図したどおりの判定結果になるわけである。

  1. もっと新しいノート <<
  2. >> もっと古いノート

冒頭に戻る


※ 以下の SNS 共有ボタンは JavaScript を使っておらず、ボタンを押すまでは SNS サイトと全く通信しません。

Twitter Facebook