【PHP8.x】keyメソッドの使い方

作成日: 更新日:

keyメソッドは、イテレータが現在指している要素のキーを返す処理を実行するメソッドです。このメソッドが所属するInternalIteratorクラスは、PHPの内部で定義されているイテレータの基本的な振る舞いを実装した抽象クラスであり、Iteratorインターフェースを継承しています。イテレータとは、配列やオブジェクトの集合といったコレクションを一つずつ順番に処理するための仕組みです。keyメソッドは、その処理の過程で現在注目している要素のキーを取得します。例えば、['apple', 'banana']という配列を処理している場合、キーは01といった数値インデックスになります。また、['name' => 'Taro']のような連想配列では、'name'という文字列がキーになります。PHPのforeachループは、内部でこのイテレータの仕組みを利用しており、foreach ($array as $key => $value)のように記述した際、各要素のキーを取得するために内部的にこのkeyメソッドが呼び出されています。keyメソッドは、要素の値を取得するcurrentメソッドと対になっており、これらが連携することでコレクションの反復処理が実現されます。

基本的な使い方

構文(syntax)

1<?php
2
3$array = [
4    'first_key' => 'Apple',
5    'second_key' => 'Banana',
6    'third_key' => 'Cherry'
7];
8
9$iterator = new ArrayIterator($array);
10
11// ループが有効な間、現在の要素のキーを出力する
12while ($iterator->valid()) {
13    // 現在のキーを取得する
14    $key = $iterator->key();
15
16    echo $key . PHP_EOL;
17
18    // 次の要素へ進む
19    $iterator->next();
20}
21
22?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

mixed

現在のイテレータが指している要素のキーを返します。

サンプルコード

PHP array_column で key by する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * 指定されたキーに基づいて配列を再インデックスする(キーでグループ化する)サンプルです。
7 *
8 * PHPの標準関数 `array_column()` を使用するのが最も簡潔で効率的な方法です。
9 * この操作は一般的に "key by" と呼ばれます。
10 *
11 * `array_column(array $array, mixed $column_key, mixed $index_key = null): array`
12 * - 第1引数 ($array): 操作の対象となる配列。
13 * - 第2引数 ($column_key): 新しい配列の値として使用する列のキー。
14 *   `null` を指定すると、元の要素全体が値として保持されます。
15 * - 第3引数 ($index_key): 新しい配列のキーとして使用する列のキー。
16 *   この引数を使って "key by" 操作を実現します。
17 */
18function keyByExample(): void
19{
20    // サンプルデータ: ユーザー情報の連想配列の配列
21    $users = [
22        ['id' => 101, 'name' => 'Alice', 'role' => 'admin'],
23        ['id' => 105, 'name' => 'Bob', 'role' => 'editor'],
24        ['id' => 210, 'name' => 'Charlie', 'role' => 'viewer'],
25    ];
26
27    // `array_column()` を使用して、'id' の値をキーにした新しい配列を生成します。
28    // 第2引数に `null` を渡して各ユーザーの全情報を値とし、
29    // 第3引数に 'id' を渡して `id` の値をキーに設定します。
30    $usersById = array_column($users, null, 'id');
31
32    // 結果を出力します。
33    print_r($usersById);
34}
35
36// 関数を実行します。
37keyByExample();
38
39/*
40 * ----- 期待される出力 -----
41 *
42 * Array
43 * (
44 *     [101] => Array
45 *         (
46 *             [id] => 101
47 *             [name] => Alice
48 *             [role] => admin
49 *         )
50 *
51 *     [105] => Array
52 *         (
53 *             [id] => 105
54 *             [name] => Bob
55 *             [role] => editor
56 *         )
57 *
58 *     [210] => Array
59 *         (
60 *             [id] => 210
61 *             [name] => Charlie
62 *             [role] => viewer
63 *         )
64 *
65 * )
66 */
67

このPHPサンプルコードは、複数のユーザー情報が格納された配列を、特定のキーの値を用いて再構成する方法を示しています。この操作は一般的に「key by」と呼ばれ、IDのような一意の値を使ってデータに直接アクセスしたい場合に非常に便利です。

処理の中心となるのは、PHPの標準関数 array_column() です。この関数は、多次元配列から特定の列を抜き出し、新しい配列を作成する機能を持っています。

array_column() 関数の第1引数には、操作の対象となる元の配列 $users を指定します。第2引数に null を渡すと、元の配列の各要素(この例ではユーザー情報全体の配列)が、そのまま新しい配列の値として保持されます。そして、この操作の鍵となるのが第3引数です。ここに 'id' を指定することで、各ユーザー情報が持つ 'id' の値が、新しい配列のキーとして使われるようになります。

このコードを実行すると、元の配列は、ユーザーID(101, 105, 210)をキーとし、各ユーザー情報を値とする新しい連想配列に変換されます。これにより、特定のIDを指定して、目的のユーザー情報を効率的に取得できるようになります。

array_column関数でキーとして指定する'id'の値が元の配列内で重複していると、後のデータで上書きされ、前のデータが失われるため注意が必要です。また、キーに指定した'id'が存在しない要素は、結果の配列から無視されます。キーとして使えるのは文字列か整数に変換できる値のみで、それ以外の型の値を指定するとエラーの原因となります。第2引数をnullにすると要素全体が値になりますが、例えば'name'を指定すれば、idをキー、名前を値とする新しい配列を作成することも可能です。この方法は、ループ処理で実装するよりコードが簡潔になり、一般的に高速に動作します。

PHP ArrayIteratorでキーの存在を確認する

1<?php
2
3/**
4 * ArrayIteratorを使い、イテレーション中に現在のキーの存在を確認し取得する例です。
5 *
6 * イテレータで「キーが存在するか」を調べるには、まず valid() メソッドで
7 * 現在の位置が有効かを確認し、有効であれば key() メソッドでキーを取得します。
8 * InternalIteratorの動作は、このIteratorインターフェースを通じて理解できます。
9 */
10function demonstrateIteratorKeyCheck(): void
11{
12    // キーと値を持つサンプル配列
13    $fruits = [
14        'a' => 'Apple',
15        'b' => 'Banana',
16        'c' => 'Cherry',
17    ];
18
19    // 配列からイテレータオブジェクトを作成します。
20    // ArrayIteratorは、配列をオブジェクトのように反復処理できるPHPの組み込みクラスです。
21    $iterator = new ArrayIterator($fruits);
22
23    echo "イテレータの各要素のキーをチェックします..." . PHP_EOL;
24
25    // whileループでイテレータを処理します。
26    // $iterator->valid() は、現在の位置に要素が存在すれば true を返します。
27    while ($iterator->valid()) {
28        // valid()がtrueなので、キーが存在することがわかります。
29        // key()メソッドで現在の要素のキーを取得します。
30        $currentKey = $iterator->key();
31
32        // current()メソッドで現在の要素の値を取得します。
33        $currentValue = $iterator->current();
34
35        // 取得したキーと値を出力します。
36        echo "キー '{$currentKey}' が存在します。(値: {$currentValue})" . PHP_EOL;
37
38        // next()メソッドで、イテレータを次の要素に進めます。
39        $iterator->next();
40    }
41
42    echo "イテレータの終端に達しました。" . PHP_EOL;
43}
44
45// 関数を実行します。
46demonstrateIteratorKeyCheck();

このサンプルコードは、PHPのArrayIteratorを使い、ループ処理中に配列の各要素のキーを取得する方法を示します。InternalIteratorインターフェースに定義されているkey()メソッドの具体的な使用例です。

key()メソッドは、イテレータが現在指している要素のキーを返す役割を持ちます。このメソッドは引数を取らず、戻り値としてキーを返します。キーは文字列や数値など様々な型を取りうるため、戻り値の型はmixedと定義されています。

イテレータで「キーが存在するか」を調べるには、key()を呼び出す前にvalid()メソッドを使うのが一般的です。valid()メソッドは、現在の位置に有効な要素が存在すればtrueを、ループの終端などで存在しなければfalseを返します。

このコードでは、whileループの条件に$iterator->valid()を指定し、要素が存在する間だけ処理を繰り返します。ループ内では、valid()trueなのでキーが存在することが保証されており、key()でキーを、current()で値を取得して出力します。そしてnext()で次の要素へ進むことで、配列の全要素を安全に処理しています。

key()メソッドを利用する際の最も重要な点は、呼び出す前に必ずvalid()メソッドでイテレータの現在位置が有効かを確認することです。valid()falseを返す、つまりイテレータが終端に達した後にkey()を呼び出すとnullが返り、意図しない不具合の原因となります。キーが存在するかはvalid()で確認し、key()はキーを取得する役割と覚えましょう。また、whileループでイテレータを操作する場合、ループの最後にnext()を呼び出して次の要素に進める処理を忘れないでください。これを忘れると無限ループに陥ります。単純な繰り返し処理であれば、これらの管理を自動で行うforeach文の利用がより安全です。

【PHP8.x】keyメソッドの使い方 | いっしー@Webエンジニア