空文字列が入った変数を count すると 1 になる
PHP をやっているといろいろな関数があって便利な反面、なんでこんな返り値なんだ!? ということが多々あるかと思います。
最近、遭遇してビックリしたのは count の振る舞い。
count — 変数に含まれるすべての要素、 あるいはオブジェクトに含まれる何かの数を数える
<?php $var = ''; // 空文字列 $result = count($var); var_dump($result); // count だと int(1) $result = strlen($var); var_dump($result); // strlen だと int(0)
既存のコードを修正してページを追加するお仕事していたときに、for が回らなくてエラーがでてハマってしまいました。
どうやら、配列を格納するべき変数なのに、メソッドのバグで空文字列が入ってしまったことが原因でした。
空文字列が入っている変数を、for で回すために count 関数で数を数えたところ、まさかの 1 が帰っていたために、おかしな動きをしていたというわけです。
int(1) という返り値のおかげで、中途半端に1回だけループしていたために、しばらくバグに気付けませんでした。
それにしても count の振る舞いは、感覚的にはわかりにくい。
count とは直訳で「数える」というわけで、空の文字列を 1 として数えるというのはどうなんでしょう。
空文字列も「数えた」場合には int(0) で良いのではないかと…
だって……
<?php $var = null; $nya = ""; $result = ($var == $nya) ? true : false; var_dump($result); // bool(true) $wan = array(); $result = ($var == $wan) ? true : false; var_dump($result); // bool(true)
空文字列や空配列と null を一緒に扱ってしまうんだから、count も空文字列を int(0) として扱ってくれませんかね。と、思うわけです。
もっとも「==を使うな」というのは、あるんですけれどね。
頑張っていきましょう。