【PHP入門】配列の値を検索するarray_searchと他4つの関数

こんにちは!ライターのmuramatsuです。

PHPでは、配列の値を検索するさまざまな方法があるのをご存知ですか?

この記事では、

  • 配列の値を検索する方法が知りたい
  • 複数の配列の値を検索する方法が知りたい
  • 多次元配列の値を検索する方法が知りたい
  • 正規表現を使用して検索する方法が知りたい
  • array_search関数とin_array関数の速度パフォーマンスが知りたい


などの基本的な内容から、応用的な方法に関しても解説していきます。

最後に関数をまとめた表もあるので、先にどういった関数があるのか知りたい方は、そちらから見てくださいね。

今回はそんな配列の値を検索する方法について、わかりやすく解説します!

配列の値を検索する方法

配列の値を検索する基本的な方法にarray_search関数が使われます。

また似た関数でin_array関数もあります。

それぞれの使い方と、違いを見ていきましょう。

array_searchを使用する

配列の値を検索するのに使われる基本的な関数array_searchは、検索した要素がある場合要素番号を返してくれます。

基本構文

array_search(検索する値, 検索対象の配列, 型の比較を行うか)

第一引数には、検索したい要素(値)を指定します。第二引数ではどの配列から検索したいか、検索する配列名を指定します。第三引数にtrueを指定すると型の比較も行います。省略可能。

検索する値が見つかった場合は値のインデックスキー(要素番号)を、その他の場合はfalseを返します。

では実際に配列$arrayの中にPHPという要素が入っているかを検索する基本的なサンプルコードをみてみましょう。

サンプルコード1

<?php

$array = ['JAVA', 'PHP', 'Python'];

$result = array_search('PHP', $array);
print_r($result);

?>

実行結果

1

検索する値'PHP'が検索対象の配列$arrayの中のインデックスキー0から数えて1番目にあるので、1が返されました。

検索する値が文字列の場合、大文字小文字は区別して比較が行われます。

サンプルコード2

<?php

$array = ['JAVA', 'PHP', 'Python'];
$result = array_search('JavaScript', $array);
var_dump($result);

?>

実行結果

bool(false)

検索する値'JavaScript'は検索対象の配列$arrayに存在しないので、falseが返されます。第三引数を指定しない場合、型の比較は行いません。

今回は検索する要素の型も見るためvar_dumpで出力していますが、結果がfalseなので真偽値型のboolが出力されています。

要素の型の比較まで行う場合には、第三引数にtrueを指定します。

サンプルコード3

<?php

$array = ['1', '2', 3];
$result = array_search(2, $array, true);
var_dump($result);

?>

実行結果

bool(false)

第三引数にtrueを指定したこのサンプルでは、型の比較も行うため検索する値の整数2と配列の文字列'2'は別のものとみなされ、falseが返されます。

第三引数を指定しない場合、整数2と文字列’2’は同じものとみなされるので注意が必要です。引数の型まで正確に比較を行いたい場合は、必ず第三引数にtrueを指定しましょう。

検索する値が配列に複数ある場合は、最初の値のインデックスキーのみが返されます。

in_arrayを使用する

関数in_arrayを使って配列の値を検索すると、要素に検索した値があるか・無いかのtrueまたはfalseで返します。

基本構文

in_array(検索する値, 検索対象の配列, 型の比較を行うか)

引数はarray_searchと同じです。

第一引数には、検索したい要素(値)を指定します。第二引数ではどの配列から検索したいか、検索する配列名を指定します。第三引数にtrueを指定すると、型の比較も行います。省略可能。

検索する値が見つかった場合はtrue、その他の場合はfalseを返します。

array_search関数と引数も同じでよく似ていますが、戻り値がインデックスキーではなくtrueまたはfalseである点が異なります。

サンプルコード

<?php

$array = ['JAVA', 'PHP', 'Python'];

// 'PHP'を検索
$result1 = in_array('PHP', $array);
var_dump($result1);
echo '<br>';

// 'JavaScript'を検索
$result2 = in_array('JavaScript', $array);
var_dump($result2);

?>

実行結果

bool(true)
bool(false)

実行結果のとおり、in_array関数で第一引数に指定した値が配列に存在する場合はtrueを返し、存在しない場合はfalseを返していますね。

第三引数の使い方もarray_search関数と同様で、型の比較まで行う場合はtrueを指定します。

複数の値を検索する

検索する値が配列に複数ある場合でも、array_search関数は最初の値のインデックスキーのみを返しました。

全てのインデックスキーを取得したい場合は、array_keys関数を使います。

基本構文

array_keys(検索対象の配列, 検索する値)

第一引数に検索する配列の配列名を指定します。第二引数に検索する値を指定します。省略可能。

array_search関数やin_array関数と引数の順番が違う点に注意してください。array_search関数は検索して見つかった全てのインデックスキーを配列にして返してくれます。

第二引数を省略した場合は配列すべてのインデックスキーが返されます。

サンプルコード

<?php

$array = ['JAVA', 'PHP', 'Python', 'PHP'];

$result = array_keys($array, 'PHP');
var_dump($result);

?>

実行結果

array(2) { [0]=> int(1) [1]=> int(3) }

見つかった複数の値が、配列で返されているのが分かりますね。

多次元配列の値を検索する

array_search関数やin_array関数は多次元配列の値を検索することができません。

そのため多次元配列で値を検索する場合は、array_column関数を指定します。

基本構文

array_column(値を取り出したい多次元配列, 値を返したいカラム)

第一引数で検索したい多次元配列の配列名を指定します。第二引数のカラムは、連想配列などのキーになる部分のことで、要素のキー名を指定して、取り出します。

指定したカラムの要素だけを取り出しそのカラムで構成された配列を返します。

以下にarray_column関数で多次元配列の中にある特定の名前を検索し、array_search関数でその名前が配列の何番目にあるかを検索するサンプルコードを見ていきましょう。

サンプルコード

<?php

$arrays = [
    0 => [
        'id' => 1,
        'name' => 'Tanaka',
        'age' => 30,
    ],
    1 => [
        'id' => 2,
        'name' => 'Yamada',
        'age' => 25,
    ],
    2 => [
        'id' => 3,
        'name' => 'Satou',
        'age' => 20,
    ],
    3 => [
        'id' => 4,
        'name' => 'Hayashi',
        'age' => 40,
    ],
];

$nameArray = array_column($arrays, 'name');
var_dump($nameArray);
echo '
';

$result = array_search('Satou', $nameArray);
var_dump($result);

?>

実行結果

array(4) { [0]=> string(6) "Tanaka" [1]=> string(6) "Yamada" [2]=> string(5) "Satou" [3]=> string(7) "Hayashi" } 
int(2) 

まずarray_column関数を使って'name'だけの配列$nameArrayを作成します。配列$nameArrayをarray_search関数に渡して変数$resultに結果を代入します。

指定した名前'Satou'が配列$nameArrayの何番目にあるかが出力されました。

正規表現を使用して検索する

正規表現とは特定の文字列からパターンになっている(文字列)部分を表すために使用されます。

array_searchとin_array関数では検索する値に正規表現を使うことができません。

検索する値が文字列の正規表現を使う場合にはpreg_grep関数を使います。

基本構文

preg_grep(検索するパターン文字列, 検索対象の配列)

第一引数に検索したいパターンの文字列を指定します。第二引数には、検索する配列の配列名を指定します。

preg_grep関数は検索対象の配列の値のうち、指定したパターン文字列にマッチする要素で構成された配列を返します。

preg_grep関数を使って、配列から全て数字の文字列(正規表現で表すと'/^[0-9]+$/')を取り出すサンプルコードを見てみましょう。

サンプルコード

<?php

$array = ['abc', '123', 'de4', '56f', 'ghi', '789'];
$result = preg_grep('/^[0-9]+$/', $array);
var_dump($result);

?>

実行結果

array(2) { [1]=> string(3) "123" [5]=> string(3) "789" }

全て数字の文字列はインデックスキー0から数えて1番目の'123'と5番目の'789'が対象となります。

配列$arrayのインデックスキー1番目と5番目で構成された配列が返されているのが分かりますね。

正規表現について詳しく知りたい方は以下の記事を参考にしてください!

速度面

使い方のよく似たarray_searchとin_array関数ですが、速度面での違いはあるのでしょうか?

要素数10000の配列を検索対象に、それぞれの関数で

「最初の要素を検索」
「最後の要素を検索」
「検索要素なし」

の3パターンの検索を10000回ループして検索を行い、速度を秒単位で計測してみました。

<?php

// 要素数10000の配列を作成
$array = [];
for ($count = 0; $count < 10000; $count++) {
    $array[] = $count;
}

// array_search関数
$time_start = microtime(true);
for ($count = 0; $count < 10000; $count++) {
    array_search(0, $array); // 最初の要素を検索
    array_search(9999, $array); // 最後の要素を検索
    array_search(10001, $array); // 検索要素なし
}
$time = microtime(true) - $time_start;
echo 'array_search:'. $time . ' seconds';
echo '<br>';

// in_array関数
$time_start = microtime(true);
for ($count = 0; $count < 10000; $count++) {
    in_array(0, $array); // 最初の要素を検索
    in_array(9999, $array); // 最後の要素を検索
    in_array(10001, $array); // 検索要素なし
}
$time = microtime(true) - $time_start;
echo 'in_array:'. $time . ' seconds';

?>

実行結果

<1回目>
array_search:0.24466800689697 seconds
in_array:0.16220092773438 seconds
<2回目>
array_search:0.24347186088562 seconds
in_array:0.16216421127319 seconds
<3回目>
array_search:0.23783612251282 seconds
in_array:0.16048288345337 seconds

in_array関数の方が処理速度が早いことがわかりました!

関数のまとめ

ここで解説した関数をわかりやすくまとめたので、ぜひ活用してくださいね。

関数用途/
基本構文
返り値
array_search配列の値1つを検索配列の要素番号/ false
array_search(検索する値, 検索対象の配列, 型の比較を行うか)
in_array配列の値1つを検索true/ false
in_array(検索する値, 検索対象の配列, 型の比較を行うか)
array_keys複数の値を検索全ての要素番号で構成された配列/ false
array_keys(検索対象の配列, 検索する値)
array_column多次元配列の値を検索カラムで構成された配列/ false
array_column(値を取り出したい多次元配列, 値を返したいカラム)
preg_grep正規表現を使用して検索マッチした要素で構成された配列/ false
preg_grep(検索するパターン文字列, 検索対象の配列)

またPHPでは配列を操作するさまざまな関数が用意されています。使い方については、以下の記事にまとめていますので、ぜひ参考にしてください!

PHPを継続的に学習するコツ

PHPの学習をしていて、わからないところが多く何回も調べながらやるのは正直、嫌になってしまいますよね。そこで、どのようにすれば継続的に学習を続けて行けるのかそのコツをご紹介します。

目的を明確にする

まずは、なぜPHPを学んでいるのか明確にしましょう。例えば、PHPを学んで

  • Webサイトが作りたい
  • WordPressの編集がしたい
  • エンジニアとして転職したい
  • フリーランスを目指したい


など、目的は色々あると思います。

この目的を明確にすることがとても大事で、PHPを学ぶ学習意欲に繋がっていきます。目的がないまま学習をしていると、学習すること自体が目的になってしまい、ゴールのない果てしない道を進むことになります。その結果、挫折してしまう人が多いのが現状となっています。

そうならないためにも、PHPを学ぶ目的は言えるようにしましょう。もし言えない場合は、学ぶプログラミング言語自体間違っている可能性もあります。なので、しっかり目的から学んでいる言語があっているか確認しましょう。

学習プランを決める

目的が明確になったら、次に学習プランを立てましょう。この学習プランを立てずに学習している人が多いのですが、学習プランがないと自分が今どのくらい進んでいて、後どのくらい学習をすればいいのか見えないので、学習をすること自体がきつく長続きしません。

学習を継続的に続けるためには学習プランは必須とも言えます。いつまでに、どのレベルになっていて、最終的なゴールはいつ達成するのかはしっかり決めましょう。

先生を見つける

「何度もエラーになって、自分で調べては修正する」この繰り返しがPHPを学習していると起こります。調べてもよくわからないし、時間もかかってしまってプラン通りに学習が進まないというのは当然のように起こります。

調べて直したけどうまく動かないしどうなってんの

このように思い、学習をすること自体に嫌気が指して挫折してしまう人も多いです。

そうならないためにも、「先生」を見つけることが大事になります。先生と言ってもそう簡単に探せそうにないですよね。最近ではSNSでもコミュニティーが増え、相談しやすい環境が増えてきています。こういったコミュニティーや勉強会を利用して先生を見つけるのも一つの手です。

自分に投資することも大事

学習サイトやアプリなど、無料で学習できる環境が整ってはいるものの自分に投資して学習をすることも大事です。本や有料学習サイトは、無料では学べない範囲の学習や機能が付いているので、効率的に学習をすることが可能です。

そして、投資のもう一つの方法がプログラミングスクールで学ぶことです。

独学と違い、プログラミングスクールでは上で紹介した学習を継続するためのサポートが徹底されているので、最も効率の良い学び方と言えるでしょう。先生も自分で探す必要がないので、エラーなどで躓いて時間がかかる心配もありません。

ですが、当然いきなりスクールに入るのは抵抗がありますよね。

その場合は、弊社で行っている無料体験レッスンへ参加してみてください。この無料体験レッスンでは、なぜPHPを学ぶのかその目的をヒアリングして、本当にPHPを学ぶべきなのか、その学習プランはどのように立てるのかなどの提案をしています。

目的をヒアリングすることで、あなたに最適な言語や学習プランが分かるので、最速でエンジニアを目指せるイメージがわきます。

手軽にしかもオンラインでも受けられるので、ぜひ一度目的を明確にしてみましょう。

無料体験レッスンに申し込む

まとめ

今回はarray_searchをはじめとする配列の値を検索するさまざまな方法について解説しました。

実際の開発でも、データを配列に格納し検索するという処理はよく使用します。

配列の値を検索する方法を忘れてしまったら、この記事を思い出して下さい!

「プログラミング、右も左もわからない…」という方にオススメ

cta_under_bnr

当プログラミングスクール「侍エンジニア」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニアは上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

詳細はこちら

書いた人

muramatsu

世界中の人たちと友達になって、その友達の家を巡る旅をしたいと密かに思っている。

複雑な内容を誰にでもわかりやすく、そして納得のいくような解説をする、をモットーにしています!

おすすめコンテンツ

まずはここから!初心者でも1から学べるプログラミング入門カリキュラム

転職成功で受講料0円!あなたもプログラミングを学んでエンジニアデビュー