phpで指定した値が配列に存在するか調べる方法
phpで配列を表示するプログラムを作りました。
その際に、配列の値の一致条件でつまづいたので、解決策をメモしておきたいと思います。
下記のようなプログラムを作りました。
$item_array
の中身を重複しないように一覧表示します。実際には、もっと条件が絡んだり、配列の中身をデータベースから呼び出したりしていますが、説明のため簡略化しています。
$item_array = array(apple, orange, banana, apple, melon); //表示する値
$item_list = array(); //すでに表示した値
foreach($item_array as $item) {
if(!array_search($item, $item_list)){
echo $item;
array_push($item_list, $item);
}
}
$item_list
にすでに表示した$item_array
の値を入れていき、表示する値が$item_list
に含まれているか確認しています。
もっと、簡単な書き方などあるかと思いますが、プログラム初心者が作るとこんな感じになりました。
指定した値が配列に存在するか確認するために、まず使用したのがarray_search()
です。
しかし上記の書き方では、表示する値がすでに表示した配列に含まれていてもifを通過して表示されてしまいました。
調べてみたところ、array_search()
は配列の中に指定した値があった場合、その配列キーを返す関数でした。そのため、値が含まれない場合の判定が適切におこなえていないようです。
array_search()
は、単純に配列に値があるかないかを判定するのには向いていないのかもしれません。
指定した値の配列存在チェックにはin_array()関数
配列にあるかないかを判定するだけであれば、in_array()
の方が適切でした。
in_array()
は、配列の中に指定した値があった場合、TRUEを。なかった場合には、FALSEを返します。
$item_array = array(apple, orange, banana, apple, melon); //表示する値
$item_list = array(); //すでに表示した値
foreach($item_array as $item) {
if(!in_array($item, $item_list)){
echo $item;
array_push($item_list, $item);
}
}
array_search()
をin_array()
に変更すると、重複した値は表示されず、想定していた動きになりました。
phpはまだまだ素人なので、関数などはほとんど検索して使用しています。 今回のように似たような使い方をする関数もあるので、返値など使う際は要注意。