array_searchを使っていて、ちょっとした落とし穴にはまってしまったことあったので、 メモ程度ですが記事にしたいと思います。
先ずは、array_searchの使い方を簡単に説明すると、第二引数で指定した配列の中から、第一引数と同じ文字列が存在した場合、一致した値の配列のキーを渡してくれます。
<サンプルコード>
$test_array = ["サル","トラ","パンダ"]; $result = array_search("パンダ",$test_array); print_r($result);
結果
2
もし配列の中と値が一致しない場合は、falseを返します。
if文で条件分岐後、1つ目の値が取得できない?
ってなことが起きてしまいました。
結論から申し上げると、0はfalseです。
訂正前のコード
因みに配列の中に値があるかどうかは、in_array()でサクッと確認ができます。
今回、array_searchを使用した理由としては、
テキスト番号と画像番号が一致している画像を取得したかったので、配列のキーを利用して下記のような関数を作成しました。
public function getImg($text) { $texts = []; for ( $i = 1; $i < 9; $i++ ){ $texts[] = $this->{"text{$i}"}; } $textNum = array_search($text,$Texts); if ( !$textNum){ return false; } $textNum += 1; return $this->{"img{$textNum}"}; }
実際の開発時のコードを若干書き換えていますが、コード見ただけだと分かりにくいと思います。
注意すべきところ、10行目の!$textNumです。
配列の中の一番先頭と一致した場合、配列のキーの0が返されます。
値が0の場合はfalseとして扱われるので、!$textNumを通してしまい、
return falseを返っていました。
正しい書き方
===を使うことにより、型が一致しているかどうかも判定する必要があります。
先ほどの10行目を下記のように変更したところ、0とfalseを区別することが出来ました。
if ( $colorTextNum === false){ return false; } $colorTextNum += 1;
これで問題なく一番先頭に一致した場合でも、欲しい値が取得できました。
以上となります! array_searchで例を出しましたが、0の値をif条件文の中で使う時は、!の否定を使用しないように注意が必要だと思いました。
それでは、Have nice development day~!