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

【PHP8.x】SplStack::key()メソッドの使い方

keyメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

keyメソッドは、SplStackオブジェクトにおいて、現在アクティブな要素のインデックスを取得するメソッドです。SplStackは、LIFO(Last In, First Out)の原則に基づき、最後に追加された要素が最初に取得されるスタックデータ構造を実装しています。

このメソッドは、SplStackオブジェクトをforeachループなどで反復処理している際に、現在処理している要素がスタック内で何番目の要素であるかを示す、0から始まる整数値のインデックスを返します。このインデックスは、要素がスタックにpushされた際に割り当てられる論理的な順番に対応しており、最初に追加された要素が0、次に追加された要素が1といった具合に値が増加します。

たとえば、スタックの要素を巡回しながら、その要素が元々スタックにどの位置で追加されたのかを把握したい場合や、スタックの特定の深さにある要素を識別したい場合にkeyメソッドが役立ちます。このメソッドは、スタックの反復処理中に現在の位置情報を正確に取得したい場合に有用です。

構文(syntax)

1<?php
2$stack = new SplStack();
3$stack->push('elementA');
4$stack->push('elementB');
5$stack->rewind(); // イテレータをスタックのトップ(最新の要素)に設定
6
7$currentIndex = $stack->key(); // 現在の要素の0から始まるインデックスを取得
8?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

SplStack::key() は、現在の要素のキー(インデックス)を整数値で返します。

サンプルコード

PHP SplStack key() で要素のキーを取得する

1<?php
2
3/**
4 * SplStack::key() メソッドのサンプルコード
5 *
6 * SplStack は「後入れ先出し (LIFO: Last-In, First-Out)」のデータ構造を提供するクラスです。
7 * スタックに最初に入れたものが最後に出てくる、というイメージです。
8 *
9 * SplStack は Iterator インターフェースを実装しているため、
10 * foreach ループや while ループを使って要素を一つずつ処理することができます。
11 *
12 * key() メソッドは、イテレータが指している「現在の要素のインデックス(キー)」を返します。
13 * このインデックスは、スタックが空でない限り有効な整数値です。
14 *
15 * このサンプルコードでは、SplStack に要素を追加し、
16 * その後、スタックをイテレートしながら各要素のキーと値を取得・表示します。
17 * また、イテレータが有効な位置(要素が存在する位置)にあるかどうかを
18 * valid() メソッドで確認する方法も示します。
19 */
20function demonstrateSplStackKey(): void
21{
22    // SplStack の新しいインスタンスを作成します。
23    $stack = new SplStack();
24
25    echo "--- 要素をスタックにプッシュ (追加) します ---\n";
26    // 要素をスタックの「上」に追加します。
27    // プッシュした順序は Apple -> Banana -> Cherry です。
28    $stack->push('Apple');
29    echo "プッシュ: Apple\n";
30    $stack->push('Banana');
31    echo "プッシュ: Banana\n";
32    $stack->push('Cherry');
33    echo "プッシュ: Cherry\n";
34
35    echo "\n--- SplStack をイテレートし、キーと値を取得します ---\n";
36    // SplStack は LIFO なので、イテレーションは最後にプッシュされたものから始まります。
37    // イテレータのキーは 0 から始まり、イテレーションの進行とともに増加します。
38    // つまり、'Cherry' がキー 0、'Banana' がキー 1、'Apple' がキー 2 となります。
39
40    // イテレータを最初の要素(最も最近プッシュされた要素)に設定します。
41    $stack->rewind();
42
43    // イテレータが有効な位置にある間(つまり、まだ処理すべき要素がある間)ループを続けます。
44    while ($stack->valid()) {
45        // 現在の要素のインデックス(キー)を取得します。
46        $currentKey = $stack->key();
47        // 現在の要素の値を取得します。
48        $currentValue = $stack->current();
49
50        echo "キー: $currentKey, 値: $currentValue\n";
51
52        // 次の要素へ移動します。
53        $stack->next();
54    }
55
56    echo "\n--- スタックが空の場合のキーと有効性の確認 ---\n";
57    // スタックから要素をすべてポップ(取り出し)して空にします。
58    while (!$stack->isEmpty()) {
59        $poppedValue = $stack->pop();
60        echo "ポップ: $poppedValue\n";
61    }
62
63    echo "スタックは空になりました。\n";
64    // 空のスタックでは、イテレータをリセットしても有効な要素はありません。
65    $stack->rewind();
66
67    // イテレータが有効な位置にない(要素が存在しない)ことを確認します。
68    if (!$stack->valid()) {
69        echo "スタックは空であり、イテレータは有効な位置にありません。\n";
70        // 空のスタックで key() を呼び出すと、通常は 0 を返します。
71        // しかし、これは有効な要素のキーではなく、現在の位置が不確定であることを示します。
72        echo "空のスタックで key() を呼び出すと: " . $stack->key() . " (これは有効なキーではありません)\n";
73    }
74}
75
76// 関数を実行します。
77demonstrateSplStackKey();

SplStackは、PHPが提供する「後入れ先出し(LIFO: Last-In, First-Out)」という特性を持つデータ構造を扱うためのクラスです。要素を追加する際はスタックの「上」に積み重ねられ、取り出す際も一番上の要素から処理されます。

SplStack::key()メソッドは、このスタックをイテレート(要素を一つずつ順に処理)する際に、現在のイテレータが指している要素のインデックス(キー)を整数型(int)で返します。このメソッドは引数を必要としません。

サンプルコードでは、まずSplStackに複数の要素を「プッシュ」(追加)しています。その後、rewind()でイテレータを初期位置に戻し、whileループとvalid()next()メソッドを使ってスタックの要素を順に処理しています。key()メソッドは、イテレーションが進むごとに現在の要素のインデックスを返します。SplStackはLIFOであるため、最後にプッシュされた要素がイテレーションの最初の要素となり、そのインデックス(キー)は0から始まります。以降、イテレーションの進行とともにキーは順に増加していきます。

スタックが空の場合、valid()メソッドはfalseを返してイテレータが有効な位置にないことを示します。この状態でkey()を呼び出すと通常0が返されますが、これは有効な要素のキーではない点に注意が必要です。SplStack::key()は、スタックの要素をイテレートする際に、各要素の相対的な順序を知るために利用されます。

SplStack::key()メソッドは、スタックをイテレートする際に現在の要素のインデックス(キー)を返します。SplStackはLIFO(後入れ先出し)のデータ構造であるため、このキーは要素がスタックにプッシュされた順序とは逆になり、0から始まります。

最も重要な注意点は、key()メソッドが意味のあるキーを返すのは、イテレータが有効な位置(valid()true)にある場合のみであることです。スタックが空の時や、イテレータが終端に達して有効な要素がない状態でkey()を呼び出すと、0を返すことがありますが、これは有効な要素のキーではありません。コードを安全に利用するため、key()を使用する前には必ずvalid()メソッドでイテレータの状態を確認してください。key()の戻り値は常に整数値です。

PHP SplStack::key() でスタックのキーを取得する

1<?php
2
3/**
4 * SplStack::key() メソッドの動作を示すサンプルコードです。
5 *
6 * SplStack は LIFO (Last-In, First-Out) の原則に基づいたスタックデータ構造を実装します。
7 * key() メソッドは、イテレータが現在指している要素のキー(インデックス)を返します。
8 * SplStack をイテレートする際、最後に push された要素(スタックのトップ)がキー 0 となり、
9 * その下の要素から順にキー 1, 2... と割り当てられます。
10 */
11function demonstrateSplStackKeyMethod(): void
12{
13    // SplStack を初期化します。
14    $stack = new SplStack();
15
16    // スタックに要素を追加します。
17    // LIFOの原則に基づき、「三番目のデータ」がスタックのトップ(一番上)に位置します。
18    $stack->push('最初のデータ');
19    $stack->push('二番目のデータ');
20    $stack->push('三番目のデータ');
21
22    echo "--- SplStack::key() メソッドによるキーと値の取得 ---\n";
23
24    // イテレータをスタックの先頭(最後に push された要素)に巻き戻します。
25    $stack->rewind();
26
27    // イテレータが有効な間、スタックの要素を順に処理します。
28    while ($stack->valid()) {
29        // 現在の要素のキーを取得します。
30        // スタックのトップ要素がキー 0、その下の要素がキー 1、というように割り当てられます。
31        $currentKey = $stack->key();
32
33        // 現在の要素の値を取得します。
34        $currentValue = $stack->current();
35
36        echo "キー: " . $currentKey . ", 値: " . $currentValue . "\n";
37
38        // イテレータを次の要素(スタックの底方向)に進めます。
39        $stack->next();
40    }
41}
42
43// 関数を実行して、SplStack::key() の動作を確認します。
44demonstrateSplStackKeyMethod();

SplStackは、データを「後入れ先出し(LIFO)」の原則で管理するスタック構造を持つクラスです。SplStack::key()メソッドは、このスタックの要素を順に処理する際に、現在イテレータが指し示している要素の「キー」(インデックス)を取得します。このメソッドに引数はなく、現在の要素のキーを整数(int)として返します。

SplStackにおけるキーの割り当て方には特徴があり、スタックに最後にpush(追加)された要素がキー「0」となり、その下の要素から順にキー「1」、「2」…と割り当てられます。これは、スタックの最上位の要素を基準とした相対的な位置を示します。

サンプルコードでは、「最初のデータ」「二番目のデータ」「三番目のデータ」の順で要素をpushしています。LIFOの原則により、「三番目のデータ」がスタックの最も上に位置します。その後、スタックの要素を順にたどりながらkey()メソッドを使用すると、「三番目のデータ」のキーが「0」、「二番目のデータ」のキーが「1」、「最初のデータ」のキーが「2」として出力されることがわかります。このように、SplStack::key()は、スタック内の要素がどの相対位置にあるかを数値で確認する際に利用できます。

SplStack::key()を利用する際は、キーの採番順序に特に注意してください。このメソッドは、スタックのトップ(最後にプッシュされた要素)をキー0とし、その下の要素から順にキー1、2と割り当てます。これは、一般的な配列のように要素を追加した順にキーが振られるのではなく、LIFO(後入れ先出し)というスタックの特性に基づいています。

key()はイテレータの現在位置を返すメソッドであり、単独では機能しません。rewind()でイテレータを初期化し、valid()current()next()といった他のイテレータ操作と組み合わせて使用することで、スタックの要素を意図した順序で安全に処理できます。他のデータ構造と比較して、このキーの採番順序の違いを理解しておくことが重要です。

関連コンテンツ