【PHP8.x】FilterIterator::key()メソッドの使い方
keyメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
keyメソッドは、FilterIteratorが現在指し示している要素のキーを取得するために実行するメソッドです。FilterIteratorクラスは、既存のイテレータに対してフィルタを適用し、条件に一致する要素のみを反復処理の対象とします。このフィルタリングされた結果をforeachループなどで処理する際、各要素の値だけでなく、それに対応するキーも必要になる場合があります。このメソッドは、そのような状況で現在の有効な要素のキーを返します。内部的には、FilterIteratorが保持している元のイテレータのkey()メソッドを呼び出し、その結果を返却する仕組みです。したがって、返されるキーのデータ型は、元のイテレータが持つキーの型(例えば、配列のインデックスであれば整数、連想配列のキーであれば文字列)に依存します。このメソッドは、current()メソッドで値を取得する際に、その値と対になるキーを正確に把握するために不可欠であり、フィルタリング後のデータセットをキーと値のペアとして正しく扱うために重要な役割を果たします。
構文(syntax)
1<?php 2 3// 奇数のみを許可するカスタムイテレータクラス 4class OddFilter extends FilterIterator 5{ 6 public function accept(): bool 7 { 8 // 現在の要素の値が奇数なら true を返す 9 return parent::current() % 2 !== 0; 10 } 11} 12 13// 元になるデータを持つArrayIteratorを作成 14$arrayIterator = new ArrayIterator(['zero' => 0, 'one' => 1, 'two' => 2, 'three' => 3, 'four' => 4]); 15 16// カスタムフィルタを適用 17$iterator = new OddFilter($arrayIterator); 18 19// フィルタリングされた要素をループ処理 20foreach ($iterator as $value) { 21 // key() メソッドを使って、フィルタリング後の現在の要素のキーを取得します。 22 // このループ内では、foreach構文の $key と同じ値が返されます。 23 $currentKey = $iterator->key(); 24 echo "キー: {$currentKey}, 値: {$value}" . PHP_EOL; 25} 26 27?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
mixed
現在のイテレータのキーを返します。
サンプルコード
PHP FilterIterator::key() でキーの存在を判定する
1<?php 2 3/** 4 * 特定のプレフィックスで始まるキーを持つ要素のみをフィルタリングするイテレータ。 5 * FilterIterator を継承して、独自のフィルタリングルールを実装します。 6 */ 7class PrefixKeyFilterIterator extends FilterIterator 8{ 9 private string $prefix; 10 11 /** 12 * コンストラクタ 13 * 14 * @param Iterator $iterator フィルタリング対象のイテレータ 15 * @param string $prefix 検索するキーのプレフィックス 16 */ 17 public function __construct(Iterator $iterator, string $prefix) 18 { 19 parent::__construct($iterator); 20 $this->prefix = $prefix; 21 } 22 23 /** 24 * 現在の要素が有効かどうかを判定します。 25 * このメソッドが true を返した場合のみ、その要素はイテレーションに含まれます。 26 * 27 * @return bool 現在の要素のキーが指定されたプレフィックスで始まっていれば true 28 */ 29 public function accept(): bool 30 { 31 // FilterIterator::key() メソッドを呼び出し、元のイテレータの現在のキーを取得します。 32 // このキーが指定されたプレフィックスで始まるかどうかを判定します。 33 return str_starts_with($this->key(), $this->prefix); 34 } 35} 36 37// サンプルデータとなる連想配列 38$data = [ 39 'user_id' => 101, 40 'user_name' => 'Alice', 41 'item_id' => 202, 42 'user_email' => 'alice@example.com', 43 'item_name' => 'Book', 44]; 45 46// 配列から ArrayIterator オブジェクトを作成 47$iterator = new ArrayIterator($data); 48 49// 'user_' プレフィックスを持つキーが存在する要素のみを抽出するフィルタを作成 50$userFilter = new PrefixKeyFilterIterator($iterator, 'user_'); 51 52echo "キーが 'user_' で始まる要素:\n"; 53 54// フィルタリングされたイテレータをループで処理 55foreach ($userFilter as $key => $value) { 56 // ループ変数 $key の値は、内部的に FilterIterator::key() を呼び出して取得されます。 57 printf(" - Key: %s, Value: %s\n", $key, $value); 58} 59 60// 実行結果: 61// キーが 'user_' で始まる要素: 62// - Key: user_id, Value: 101 63// - Key: user_name, Value: Alice 64// - Key: user_email, Value: alice@example.com 65
FilterIterator::key()メソッドは、フィルタリング対象のデータ(イテレータ)が指し示している現在の要素のキーを取得するために使用します。このメソッドに引数はなく、戻り値は現在のキーそのものです。キーは文字列や数値など様々な型を取りうるため、戻り値の型はmixedとなります。
このサンプルコードでは、FilterIteratorを継承して、キーが特定の文字列(プレフィックス)で始まる要素だけを抽出する独自のフィルタクラスPrefixKeyFilterIteratorを作成しています。その核となるのがaccept()メソッドです。このメソッドは、要素を通過させるかどうかを判定する場所であり、内部で$this->key()を呼び出すことで、元のデータ(配列)のキーを一つずつ取得しています。そして、取得したキーが指定されたプレフィックス('user_')で始まるかを判定し、条件に一致する場合のみtrueを返します。
foreachループでフィルタリングされた結果を処理する際も、各要素のキーは内部的にkey()メソッドによって取得されています。このようにFilterIterator::key()は、accept()メソッドと組み合わせることで、キーに基づいた柔軟なフィルタリング条件を実装する上で中心的な役割を果たします。
FilterIteratorを継承したクラス内で呼び出すkey()メソッドは、フィルタリング対象となっている元のイテレータの現在のキーを取得します。これはaccept()メソッド内で、どの要素を有効とするかの判定条件として利用するのが主な使い方です。foreachでフィルタ済みのイテレータを処理する際に、$key => $valueとしてキーを受け取りますが、この$keyの値も内部的にkey()メソッドによって取得されています。注意点として、key()メソッドの戻り値の型はmixedであり、必ずしも文字列とは限りません。サンプルコードのように文字列操作関数を使う場合は、キーが意図した型であることを前提に実装する必要があります。
PHP FilterIterator::key()でキーを抽出する
1<?php 2 3/** 4 * FilterIteratorを継承し、特定のキーを持つ要素のみを抽出するカスタムイテレータ。 5 * 6 * この例では、キーが文字列 'product_' で始まる要素のみを許可します。 7 */ 8class ProductFilter extends FilterIterator 9{ 10 /** 11 * このメソッドが true を返す要素のみがイテレーションの対象となります。 12 * 13 * @return bool 現在の要素をイテレーションに含める場合は true、除外する場合は false。 14 */ 15 public function accept(): bool 16 { 17 // 内部イテレータの現在のキーを取得します。 18 // これが FilterIterator::key() メソッドの主な使用例です。 19 $currentKey = $this->key(); 20 21 // キーが文字列 'product_' で始まるかどうかを判定します。 22 return str_starts_with((string)$currentKey, 'product_'); 23 } 24} 25 26// フィルタリング対象となるキー(key)と値(value)のペアを持つ連想配列 27$items = [ 28 'product_id_1' => 'Laptop', 29 'category' => 'Electronics', 30 'product_id_2' => 'Mouse', 31 'store_name' => 'Tech Shop', 32 'product_id_3' => 'Keyboard', 33]; 34 35// 配列をイテレータオブジェクトに変換します。 36$iterator = new ArrayIterator($items); 37 38// カスタムフィルタを使ってイテレータをラップします。 39$productIterator = new ProductFilter($iterator); 40 41// フィルタリングされた結果を foreach でループ処理します。 42// ループの各ステップで、内部的に key() と current() が呼び出されます。 43echo "Products found:\n"; 44foreach ($productIterator as $key => $value) { 45 // $key には key() メソッドの戻り値が、 46 // $value には current() メソッドの戻り値が格納されます。 47 printf("- Key: %s, Value: %s\n", $key, $value); 48}
このサンプルコードは、PHPのFilterIteratorというクラスを利用して、配列の中から特定の条件に合うキーを持つ要素だけを抽出する方法を示しています。FilterIteratorが持つkey()メソッドは、この処理で中心的な役割を果たします。
key()メソッドは引数を取りません。戻り値として、イテレータが現在指している要素のキー(key)を返します。キーのデータ型は様々であるため、戻り値の型はmixedとなります。
サンプルコードでは、ProductFilterという独自のクラスを定義し、その中のaccept()メソッドで$this->key()を呼び出しています。これにより、元の配列$itemsに含まれる各要素のキー(例: 'product_id_1'や'category')を一つずつ取得します。そして、取得したキーが'product_'という文字列で始まるかどうかを判定します。foreachループでこのフィルタを適用すると、accept()メソッドがtrueを返した要素、つまり条件に合致したキーと値(keyとvalue)のペアだけが、最終的に画面に出力される仕組みです。このようにkey()メソッドは、キーに基づいてデータをフィルタリングする際に不可欠な機能を提供します。
FilterIteratorは、それ自体がデータを持つのではなく、ArrayIteratorのような別のイテレータを包み込み、条件に合う要素だけを取り出すためのクラスです。acceptメソッド内で使う$this->key()は、元のイテレータが指している現在の要素のキーを取得します。このキーの型は文字列とは限らないため、サンプルコードのように(string)でキャストしてから文字列関数で比較すると、予期せぬエラーを防げます。foreachループでこのイテレータを使うと、acceptメソッドがtrueを返した要素のキーと値のペアだけが、変数 $key と $value に自動的にセットされて処理されます。