「あるディレクトリ内のファイル名を配列に入れ、指定のファイル名が存在しなければそのファイルを作成」
みたいなことをやっていた。
そのファイル名の存在判定にarray_searchを用いたが、当初意図していた通りに動いてくれなかったので、メモがてら投稿。
そもそもarray_searchとは
公式より
http://php.net/manual/ja/function.array-search.php
array_search — 指定した値を配列で検索し、見つかった場合に対応する最初のキーを返す
mixed array_search ( mixed $needle , array $haystack [, bool $strict = false ] )
haystack において needle を検索します。
例
ramen1.php
<?php
$ramen = ['shoyu', 'miso', 'tonkotsu'];
// 2が返る
echo array_search('tonkotsu', $ramen);
if文の条件で使うときは注意が必要
ramen2.php
<?php
$ramen = ['shoyu', 'miso', 'tonkotsu'];
if (array_search('tonkotsu', $ramen)) {
echo 'yoshimuraya ';
}
if (array_search('shoyu', $ramen)) {
echo 'tsuta ';
}
if (array_search('shio', $ramen)) {
echo 'kaijin ';
}
yoshimuraya tsuta
と出てきてほしいところだが、
出力結果
yoshimuraya
これはarray_search('shoyu', $ramen) = 0
がfalse
と同様の判定をされるため。
正しい結果を得るためにはこうする。
ramen2_1.php
<?php
$ramen = ['shoyu', 'miso', 'tonkotsu'];
if (array_search('tonkotsu', $ramen) !== false) {
echo 'yoshimuraya ';
}
if (array_search('shoyu', $ramen) !== false) {
echo 'tsuta ';
}
if (array_search('shio', $ramen) !== false) {
echo 'kaijin ';
}
出力結果
yoshimuraya tsuta
まとめ
array_searchをif文の条件として用いる際は、面倒くさがらずに型判定すべきでした。
…気をつけよう。