9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

array_searchを条件式に使うときは、型に注意する

Last updated at Posted at 2017-11-08

「あるディレクトリ内のファイル名を配列に入れ、指定のファイル名が存在しなければそのファイルを作成」
みたいなことをやっていた。

そのファイル名の存在判定に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) = 0falseと同様の判定をされるため。

正しい結果を得るためにはこうする。

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文の条件として用いる際は、面倒くさがらずに型判定すべきでした。
…気をつけよう。

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?