Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】array_find_key()関数の使い方

array_find_key関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

array_find_key関数は、配列の中から特定の条件を満たす最初の要素のキーを見つけることを実行する関数です。この関数は、検索対象となる配列と、検索条件を定義するためのコールバック関数を引数として受け取ります。

コールバック関数は、配列の各要素に対して順番に適用され、その要素が検索条件に合致するかどうかを評価します。コールバック関数が真(true)を返した時点で、その要素のキーがarray_find_key関数の結果として返され、それ以降の要素の評価は行われません。これにより、配列全体を走査することなく、目的のキーを効率的に見つけることが可能です。

もし配列内のどの要素もコールバック関数が定義する条件を満たさなかった場合、この関数はnullを返します。これは、条件に合致する要素が存在しなかったことを示します。array_find_key関数は、大規模な配列の中から特定の条件でキーを迅速に検索したい場合や、複雑なロジックに基づいて要素のインデックスを特定したい場合に非常に有用です。例えば、オブジェクトの配列から特定のプロパティ値を持つ最初のオブジェクトのキーを特定する際などに活用できます。

構文(syntax)

1array_find_key(array $array, callable $callback): string|int|null

引数(parameters)

array $array, callable $callback

  • array $array: 検索対象の配列
  • callable $callback: 配列の各要素に対して実行されるコールバック関数。この関数は配列のキーと値を受け取り、要素が条件に一致した場合はtrueを、それ以外の場合はfalseを返します。

戻り値(return)

mixed

配列内で検索した値が最初に見つかったキーを返します。値が見つからなかった場合は null を返します。

サンプルコード

PHP array_find_key で条件に合うキーを検索する

1<?php
2
3/**
4 * 指定されたコールバック関数に基づいて、配列内で最初に条件を満たすキーを検索します。
5 *
6 * @param array    $array    検索対象の配列。
7 * @param callable $callback コールバック関数。各要素に対して実行され、true を返すとそのキーが返されます。
8 *
9 * @return mixed 条件を満たす最初のキー。見つからない場合は null。
10 */
11function array_find_key(array $array, callable $callback): mixed
12{
13    foreach ($array as $key => $value) {
14        if ($callback($value, $key)) {
15            return $key;
16        }
17    }
18
19    return null;
20}
21
22// 使用例
23$data = [
24    'apple' => 10,
25    'banana' => 20,
26    'orange' => 30,
27];
28
29$key = array_find_key($data, function ($value, $key) {
30    return $value > 15; // 値が15より大きい最初の要素のキーを検索
31});
32
33if ($key !== null) {
34    echo "条件を満たすキー: " . $key . PHP_EOL; // 結果:条件を満たすキー: banana
35} else {
36    echo "条件を満たすキーは見つかりませんでした。" . PHP_EOL;
37}

array_find_key関数は、PHP 8で配列の中から指定された条件を満たす最初のキーを検索するために使用します。この関数は、検索対象の配列 $array と、各要素に対して実行されるコールバック関数 $callback を引数として受け取ります。

コールバック関数 $callback は、配列の各要素の値を引数として受け取り、条件を満たす場合は true、そうでない場合は false を返す必要があります。array_find_key関数は、配列を順番に処理し、コールバック関数が true を返した最初の要素のキーを返します。

もし、配列内にコールバック関数の条件を満たす要素が見つからなかった場合、array_find_key関数は null を返します。戻り値の型は mixed であり、キーが見つかった場合はそのキーの値(文字列、数値など)、見つからなかった場合は null が返されます。

サンプルコードでは、連想配列 $data から値が15より大きい最初の要素のキーを検索しています。コールバック関数内で $value > 15 という条件を指定しており、'banana' の値が20であるため、この条件を満たします。したがって、array_find_key 関数は 'banana' を返し、結果として「条件を満たすキー: banana」と表示されます。もし、条件を満たす要素が配列内に存在しない場合は、「条件を満たすキーは見つかりませんでした。」と表示されます。

array_find_keyは、配列の各要素に対してコールバック関数を実行し、最初にtrueを返す要素のキーを返します。コールバック関数は、要素の値とキーを引数として受け取ります。キーが見つからない場合はnullを返す点に注意が必要です。サンプルコードでは、$key !== nullで存在チェックを行っていますが、PHP8以降ではis_null($key)よりも型安全な$key === nullの使用が推奨されます。また、コールバック関数内で外部変数を使用する場合は、useキーワードで明示的に変数をスコープに取り込む必要があります。コールバック関数が複雑になる場合は、可読性を高めるために、名前付き関数として定義することを検討してください。

PHP: 配列のキーを値から探す

1<?php
2
3/**
4 * 配列内で、指定されたコールバック関数によって最初に真と評価された要素のキーを返す。
5 *
6 * @param array $array 検索対象の配列
7 * @param callable $callback コールバック関数。引数として配列の各要素が渡される。
8 * @return mixed|null 真と評価された要素のキー。見つからない場合は null を返す。
9 */
10function array_find_key(array $array, callable $callback): mixed
11{
12    foreach ($array as $key => $value) {
13        if ($callback($value)) {
14            return $key;
15        }
16    }
17
18    return null;
19}
20
21// 使用例
22$data = [
23    'apple' => 'red',
24    'banana' => 'yellow',
25    'grape' => 'purple',
26];
27
28$key = array_find_key($data, function ($value) {
29    return $value === 'yellow';
30});
31
32if ($key !== null) {
33    echo "キーが見つかりました: " . $key . PHP_EOL; // 出力: キーが見つかりました: banana
34} else {
35    echo "キーは見つかりませんでした。" . PHP_EOL;
36}
37
38$key = array_find_key($data, function ($value) {
39    return $value === 'green';
40});
41
42if ($key !== null) {
43    echo "キーが見つかりました: " . $key . PHP_EOL;
44} else {
45    echo "キーは見つかりませんでした。" . PHP_EOL; // 出力: キーは見つかりませんでした。
46}

array_find_key関数は、PHP 8で配列の中から特定の条件を満たす要素のキーを検索するために使用します。この関数は、配列$arrayとコールバック関数$callbackを引数に取ります。$callbackは配列の各要素に対して実行され、真偽値を返す必要があります。

array_find_keyは、配列$arrayの各要素を順番に$callbackに渡し、$callbackが最初にtrueを返した要素のキーを返します。もし、配列内に$callbacktrueを返す要素がない場合は、nullを返します。

サンプルコードでは、まずarray_find_key関数を定義しています。この関数は、foreachループを使って配列を反復処理し、各要素に対して$callbackを実行します。$callbacktrueを返した場合、その要素のキーを返します。

次に、この関数の使用例を示しています。果物の名前と色のペアを持つ配列$dataを用意し、array_find_keyを使って値が'yellow'である要素のキーを検索しています。同様に、値が'green'である要素のキーを検索する例も示しています。この例では、'yellow'のキーはbananaであるため、"キーが見つかりました: banana"と出力されます。一方、'green'は配列内に存在しないため、"キーは見つかりませんでした。"と出力されます。

この関数を使用することで、配列の値を基にキーを効率的に検索できます。

array_find_key関数は、配列の値を一つずつコールバック関数に渡し、最初にtrueを返したキーを返します。コールバック関数は、探したい値の条件を記述します。注意点として、コールバック関数には配列の値そのものが渡されるため、キーを直接参照することはできません。また、該当する要素が見つからない場合はnullが返されるため、!== nullを使って厳密に比較する必要があります。もしキーではなく値そのものを取得したい場合は、array_find_key関数を参考にarray_find_valueのような関数を別途実装する必要があります。コールバック関数が複雑になる場合は、事前に変数に代入することで可読性を高めることができます。

PHP: 配列のキーを再帰的に検索する

1<?php
2
3/**
4 * Recursively searches for a key in a nested array structure based on a callback function.
5 *
6 * This function traverses an array, including its nested array elements,
7 * and applies a user-defined callback function to each key-value pair.
8 * It returns the key of the first element for which the callback returns true.
9 *
10 * @param array $array The array to search in.
11 * @param callable $callback The callback function to use. It accepts two arguments:
12 *                           the current element's value and its key.
13 *                           It should return true if the key/value pair matches the criteria.
14 * @return mixed The key of the first matching element found, or null if no element matches.
15 */
16function array_find_key_recursive(array $array, callable $callback): mixed
17{
18    foreach ($array as $key => $value) {
19        // Check if the current key/value pair matches the criteria defined by the callback
20        if ($callback($value, $key)) {
21            return $key; // Return the key of the found element
22        }
23
24        // If the current value is an array, recursively search within it
25        if (is_array($value)) {
26            $foundKey = array_find_key_recursive($value, $callback);
27            // If a key was found in the nested array, return it
28            if ($foundKey !== null) {
29                return $foundKey;
30            }
31        }
32    }
33
34    return null; // No matching element found in the array or its nested arrays
35}
36
37// --- サンプル使用例 ---
38
39$data = [
40    'id' => 1,
41    'name' => 'Root Item',
42    'children' => [
43        'child_1' => [
44            'id' => 101,
45            'name' => 'Sub Item A',
46            'tags' => ['important', 'new'],
47            'details' => [
48                'code' => 'A-101',
49                'status' => 'active',
50                'version' => 8.1
51            ]
52        ],
53        'child_2' => [
54            'id' => 102,
55            'name' => 'Sub Item B',
56            'details' => [
57                'code' => 'B-102',
58                'status' => 'pending'
59            ]
60        ],
61        'child_3' => [
62            'id' => 103,
63            'name' => 'Sub Item C',
64            'tags' => ['old'],
65            'details' => [
66                'code' => 'C-103',
67                'status' => 'active',
68                'version' => 8.0
69            ]
70        ]
71    ],
72    'status' => 'published',
73    'version' => 7.4
74];
75
76echo "--- キーを再帰的に検索する例 ---" . PHP_EOL;
77
78// 例1: 値が 'active' である最初の要素のキーを見つける
79// (最初にヒットするのは 'child_1' の 'details' 内の 'status')
80$key1 = array_find_key_recursive($data, fn($value) => $value === 'active');
81echo "値 'active' を持つ最初のキー: " . ($key1 ?? '見つかりませんでした') . PHP_EOL;
82
83// 例2: キー名が 'version' である最初の要素のキーを見つける
84// (最初にヒットするのはルートの 'version')
85$key2 = array_find_key_recursive($data, fn($value, $key) => $key === 'version');
86echo "キー名 'version' を持つ最初のキー: " . ($key2 ?? '見つかりませんでした') . PHP_EOL;
87
88// 例3: キー名が 'version' で、かつ値が 8.0 以上の要素のキーを見つける
89// (最初にヒットするのは 'child_1' の 'details' 内の 'version')
90$key3 = array_find_key_recursive($data, fn($value, $key) => $key === 'version' && is_float($value) && $value >= 8.0);
91echo "キー名 'version' で値が 8.0 以上の最初のキー: " . ($key3 ?? '見つかりませんでした') . PHP_EOL;
92
93// 例4: 値に 'important' タグが含まれる要素のキーを見つける
94// (最初にヒットするのは 'child_1' の 'tags')
95$key4 = array_find_key_recursive($data, fn($value) => is_array($value) && in_array('important', $value));
96echo "'important' タグを含む最初のキー: " . ($key4 ?? '見つかりませんでした') . PHP_EOL;
97
98// 例5: 存在しない条件で検索
99$key5 = array_find_key_recursive($data, fn($value) => $value === 'nonexistent_value');
100echo "値 'nonexistent_value' を持つ最初のキー: " . ($key5 ?? '見つかりませんでした') . PHP_EOL;

array_find_key_recursive関数は、PHP 8以降で利用できる、多次元配列の中から特定の条件に合致する要素のキーを再帰的に検索するためのカスタム関数です。この関数は、ネストされた配列の深部まで探し、最初に条件を満たした要素のキーを返します。

第一引数 $array には、検索対象となる配列を指定します。この配列は、複数の階層を持つ複雑な構造であっても問題ありません。

第二引数 $callback には、検索条件を定義するコールバック関数を指定します。このコールバック関数は、検索中の要素の値とキーの二つの引数を受け取り、条件に合致する場合にtrueを返してください。コールバック関数は、要素の値のみ、あるいはキー名を含めた詳細な条件を設定できます。

この関数は、コールバック関数がtrueを返した最初の要素のキーを返します。もし配列のどこにも条件に合致する要素が見つからなかった場合は、nullを返します。これにより、複雑なデータ構造から特定の情報を持つキーを効率的に見つけ出すことが可能となります。

この関数はPHPの組み込み関数ではなく、カスタムで実装された、ネストされた配列から条件に合うキーを再帰的に検索する機能です。検索条件は引数のコールバック関数で定義し、値とキーの両方を利用して柔軟に設定できます。条件に合致する最初のキーが見つかった時点で検索を停止し、そのキーを返します。キーが見つからなかった場合はnullが返されるため、戻り値のnullチェックは必ず行ってください。大規模な配列や深くネストした構造では、再帰呼び出しによりパフォーマンスに影響が出る可能性があるためご注意ください。

関連コンテンツ

関連プログラミング言語