定義と使用方法
- PHPバージョン
- 4.0.5+
array_search()関数は配列から値を検索します。
検索に成功した場合は最初に一致したキー(インデックス)を返し、失敗した場合はfalseを返します。
特徴
- 検索する値が文字列の場合は大文字と小文字を区別します。
- 検索した値が複数見つかった場合は、最初に一致したキー(インデックス)のみを返します。
- 第三引数を
trueに設定すると、データタイプまで一致している場合にのみ検索される厳密モードとなります。
通常は数値2と文字列'2'は同じとみなされますが、厳密モードでは数値2と文字列'2'は同じとはみなされません。
基本の例
// 基本例1:通常の配列でのarray_search()
$arr = ['a', 'b', 'c'];
$key = array_search('c', $arr);
var_dump($key); // 出力:int(2)
$notFound = array_search('d', $arr);
var_dump($notFound); // 出力:bool(false)
// 基本例2:連想配列でのarray_search()
$fruits = [
'apple' => 'red',
'banana' => 'yellow',
'cherry' => 'red'
];
$colorToFind = array_search('red', $fruits);
var_dump($colorToFind); // 出力:string(5) "apple"
構文
array_search(mixed $needle, array $haystack, bool $strict = false): int|string|false
引数
$needle |
検索する値です。 文字列の場合は検索時の比較において大文字と小文字が区別されます。 |
|---|---|
$haystack |
検索対象の配列です。 |
$strict |
オプションです。$needleの値をデータタイプまで一致させるかどうか(true、false)を指定します。もし $strictを
|
戻り値
検索に成功した場合は最初に一致したキー(インデックス)を返し、失敗した場合はfalseを返します。
$fruits = [
'apple' => 'red',
'banana' => 'yellow',
'cherry' => 'red'
];
// $fruits配列から'red'の値を検索し、最初に一致したキー(インデックス)を返します。
$colorToFind = array_search('red', $fruits);
// $fruits配列には'red'の値を持つキー(インデックス)が2つあります。'apple'と'cherry'です。
// $colorToFindには'red'を持つ最初の項目のキー(インデックス)が代入されます。
// したがって$colorToFindは'apple'となります。
var_dump($colorToFind); // 出力:string(5) 'apple'
返り値の比較に関する注意点
array_search()関数を使用する際は、返り値を確認するために厳密等価比較(===)演算子を使用してください。
次の例は、厳密でない等価比較(==)演算子を使用した場合と、厳密等価比較(===)演算子を使用した場合の評価結果の違いを示す例です。
$numbers = [0, "0", false, null];
$searchValue = 0;
$result = array_search($searchValue, $numbers, true);
if ($result == false) {
echo "検索する値 $searchValue は配列内で見つかりませんでした。";
} else {
echo "検索する値 $searchValue の位置はインデックス $result です。";
}
// 誤った結果が発生!!!
// 出力:'検索する値 0 は配列内で見つかりませんでした。'
if ($result === false) {
echo "検索する値 $searchValue は配列内で見つかりませんでした。";
} else {
echo "検索する値 $searchValue の位置はインデックス $result です。";
}
// 出力:'検索する値 0 の位置はインデックス 0 です。'
この例は、array_search()関数を使用して配列から値を検索し、検索結果を確認する例です。注意すべき点は、2つの比較方法の違いです。
- 最初の
if文では、厳密でない等価比較(==)演算子を使用して結果を確認しており、falseと0が同じものとして扱われます。したがって、「検索する値 $searchValue は配列内で見つかりませんでした。」というメッセージが出力され、誤った結果が発生します。 - 2番目の
if文では、厳密等価比較(===)演算子を使用して結果を確認しており、データ型と値が完全に一致する必要があります。したがって、「検索する値 $searchValue は配列内で見つかりませんでした。」というメッセージは出力されません。
結論として、厳密等価比較(===)演算子を使用することで、返り値を正確に評価でき、コードの安定性を向上させることができます。
さまざまな活用例
array_search()関数は主に次のような例の目的で使用されます。
存在する値の検索
$numbers = [1, 2, 3, 4, 2, 5, 6];
$searchValue = 2;
if (array_search($searchValue, $numbers) !== false) {
echo '検索する値が存在します。';
} else {
echo '検索する値は存在しません。';
}
// 出力:'検索する値が存在します。'
上記のコードは、配列$numbersから$searchValueの値(ここでは2)を検索し、その値が存在するかどうかを確認する例です。array_search()関数は、指定した値が配列で見つかれば最初に一致した位置のキー(インデックス)を返し、見つからなければfalseを返します。このコードでは「検索する値が存在します。」というメッセージが出力されます。
検索した値の削除または変更
$products = [
'apple' => 1.99,
'banana' => 0.99,
'cherry' => 2.49
];
$targetPrice = 1.00; // 検索する価格
$key = array_search($targetPrice, $products);
if ($key !== false) {
unset($products[$key]); // 見つかった値を削除
// または値を変更:$products[$key] = 新しい価格;
} else {
echo '見つからない製品または価格です。';
}
// 出力:'見つからない製品または価格です。'
この例では、$targetPriceの値(ここでは1.00)を検索し、配列から削除するか値を変更します。array_search()関数は、該当する製品が存在するかどうかを確認し、見つかれば削除または変更の操作を行います。
2次元配列の検索
$students = [
['name' => 'Alice', 'age' => 20],
['name' => 'Bob', 'age' => 22],
['name' => 'Charlie', 'age' => 21]
];
$searchName = 'Bob';
foreach ($students as $key => $student) {
if (array_search($searchName, $student) !== false) {
echo "名前が $searchName の学生を見つけました。学生番号:$key";
break;
}
}
// 出力:'名前が Bob の学生を見つけました。学生番号:1'
コード補足説明foreach()ループは、配列やオブジェクトを順に処理する際に使用される代表的な構文です。
上記の例では、2次元配列$studentsに対して学生の名前を検索し、該当する学生の情報を出力します。array_search()関数は各学生の配列内で名前を検索し、該当する学生のインデックス(学生番号)を返します。検索が成功した場合はループを終了し、該当する学生の情報を出力します。これは学生管理やデータ検索のような場面で有効に活用できる例です。
特定の値を配列から検索して位置を確認
$numbers = [3, 5, 2, 8, 10, 6];
$searchValue = 8;
$key = array_search($searchValue, $numbers);
if ($key !== false) {
echo "検索する値 $searchValue の位置はインデックス $key です。";
} else {
echo "検索する値 $searchValue は配列内に存在しません。";
}
// 出力:'検索する値 8 の位置はインデックス 3 です。'