- 2008/01/10
- PHP
PHPで配列の中に目的の値が入っているかどうかをチェックしたくなったので、良い感じの関数ないかなーとマニュアルを見ていたらいっぱい出てきました(PHPの場合、たいがい目的にあった関数が用意されていたりするので、組む前にチェックすると吉)。
それぞれ同じ目的を達成できますが、微妙に違うのでどれを使えば良いかを調べてみました。
array_search()
array_search() は、配列の中に指定した値があった場合、その配列キーを返します。複数の値がある場合は、先頭の配列キーのみが返ってきます。また、見つからなかった場合は bool型のFALSEを返しますが、場合によっては 0 や "" といった値を返す事もあるそうなので、判定には気をつけてください。
また、
if(!array_search($searchStr,$array)){
print 'None';
}else{
print 'Hit';
}
とすると、もし一番最初の配列に目的の値があった場合 0 を返してしまい、「None」が表示されてしまいます。PHPではなるべく型のチェックをする「===」「!==」を使用するようにすると良いと思います。
if(array_search($searchStr,$array) === FALSE)){
print 'None';
}else{
print 'Hit';
}
in_array()
in_array() は、配列の中に指定した値があった場合、TRUEを。なかった場合には、FALSEを返します。なので、中に入っているかどうかのチェックだけでよければ、array_search() よりも in_array() を使った方が混乱が少ないかもしれません。
array_keys()
array_keys() は、array_search() と in_array() とは引数の順番が違い、「配列」「検索値」の順になります。2番目の引数はオプションで、指定しなかった場合は配列全てのキーを返します。
また、array_search() との違いは、重複した値があった場合でも全てのキーを配列にして返してくれます。配列のキーを使いたい場合は、array_keys() を使用した方がメリットは高そうです。
その他、まとめ
- 検索値に文字列を指定した場合、大文字小文字を区別して判定する
- パフォーマンスは、array_search() と in_array() はほぼ同じ
- array_keys() は配列を最後まで見るためか、他2つと比べると遅い
実際に試してみた
変数
$str1 = 'ZARU';
$str2 = 'zaru';
$array1 = array('ghi','jkl');
$array2 = array('GHI','JKL');
$strArray1 = array(
'abc','def','ZARU',
);
$strArray2 = array(
array(
'abc','def',
),
array(
'ghi','jkl',
),
'ZARU',
);
$strArray3 = array(
'abc','def','ZARU',
'abc','def','ZARU',
);
array_search : 結果
| array_search($str1,$strArray1) | int(2) | array_search($str1,$strArray2) | int(2) |
|---|---|
| array_search($str1,$strArray3) | int(2) |
| array_search($array1,$strArray1) | bool(false) |
| array_search($array1,$strArray2) | int(1) |
| array_search($str2,$strArray1) | bool(false) |
| array_search($str2,$strArray2) | bool(false) |
| array_search($array2,$strArray1) | bool(false) |
| array_search($array2,$strArray2) | bool(false) |
in_array : 結果
| in_array($str1,$strArray1) | bool(true) | in_array($str1,$strArray2) | bool(true) |
|---|---|
| in_array($str1,$strArray3) | bool(true) |
| in_array($array1,$strArray1) | bool(false) |
| in_array($array1,$strArray2) | bool(true) |
| in_array($str2,$strArray1) | bool(false) |
| in_array($str2,$strArray2) | bool(false) |
| in_array($array2,$strArray1) | bool(false) |
| in_array($array2,$strArray2) | bool(false) |
array_keys : 結果
| array_keys($strArray1,$str1) | array(1) { [0]=> int(2) } | array_keys($strArray2,$str1) | array(1) { [0]=> int(2) } |
|---|---|
| array_keys($strArray3,$str1) | array(2) { [0]=> int(2) [1]=> int(5) } |
| array_keys($strArray1,$array1) | array(0) { } |
| array_keys($strArray2,$array1) | array(1) { [0]=> int(1) } |
| array_keys($strArray1,$str2) | array(0) { } |
| array_keys($strArray2,$str2) | array(0) { } |
| array_keys($strArray1,$array2) | array(0) { } |
| array_keys($strArray2,$array2) | array(0) { } |
- Newer: Rubyを使ってTwitterにBASIC認証をしてAPIを利用する
- Older: PHPでGZIPのファイルを解凍する