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

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

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

作成日: 更新日:

基本的な使い方

addメソッドは、SplDoublyLinkedListオブジェクトの指定された位置に新しい要素を挿入するメソッドです。SplDoublyLinkedListは、要素を前からも後ろからも効率的に追加・削除できる双方向リストを表すクラスであり、このaddメソッドは、リストの途中や先頭、末尾に要素を挿入したい場合に利用されます。

このメソッドは2つの引数を受け取ります。最初の引数$indexは、要素を挿入したい位置を示す整数です。このインデックスは、0からリストの現在の要素数(カウント)までの範囲で指定する必要があります。例えば、0を指定するとリストの先頭に要素が挿入され、現在の要素数と同じ値を指定するとリストの末尾に追加されます。2番目の引数$valueは、リストに挿入する任意の型の値です。

指定された$indexの位置に$valueが挿入されると、元々その位置にあった要素とそれ以降の全ての要素は、自動的に一つ後ろの位置に移動します。これにより、リストの順序が保持されます。もし$indexが0未満であるか、リストの要素数を超えている場合、このメソッドはOutOfBoundsExceptionをスローし、エラーとなりますので注意が必要です。このメソッドは値を返しません(void)。リストの途中に新しい情報を効率的に追加したい時に非常に便利な機能を提供します。

構文(syntax)

1<?php
2$doublyLinkedList = new SplDoublyLinkedList();
3$doublyLinkedList->add(0, 'value_to_add');
4?>

引数(parameters)

int $index, mixed $value

  • int $index: 要素を追加する位置を示す整数。0から始まるインデックスで指定します。
  • mixed $value: 追加する要素の値。任意の型を指定できます。

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

SplDoublyLinkedList::addで要素を挿入する

1<?php
2
3// SplDoublyLinkedList は、両方向からアクセス可能なリンクリストを提供するPHPの拡張機能です。
4// このサンプルコードでは、リストの任意のインデックスに要素を挿入する `add` メソッドの使い方を示します。
5// `add` メソッドは `int $index` と `mixed $value` を引数に取り、戻り値はありません。
6
7// SplDoublyLinkedList の新しいインスタンスを作成します。
8$list = new SplDoublyLinkedList();
9
10// push() メソッドでリストの末尾にいくつかの要素を追加します。
11$list->push('Apple');
12$list->push('Banana');
13$list->push('Cherry');
14
15echo "--- 初期リスト ---\n";
16// リストの内容をループで表示します。
17foreach ($list as $key => $value) {
18    echo "  インデックス $key: " . $value . "\n";
19}
20echo "現在の要素数: " . $list->count() . "\n\n";
21
22// `add` メソッドを使用して、指定されたインデックスに新しい要素を挿入します。
23// 例: インデックス1 ('Banana' の位置) に 'Orange' を挿入します。
24// 既存の要素は後方にシフトされます。
25$list->add(1, 'Orange');
26
27echo "--- インデックス1に 'Orange' を挿入後 ---\n";
28foreach ($list as $key => $value) {
29    echo "  インデックス $key: " . $value . "\n";
30}
31echo "現在の要素数: " . $list->count() . "\n\n";
32
33// 別の場所に挿入する例: リストの先頭 (インデックス0) に 'Grape' を挿入します。
34$list->add(0, 'Grape');
35
36echo "--- インデックス0に 'Grape' を挿入後 ---\n";
37foreach ($list as $key => $value) {
38    echo "  インデックス $key: " . $value . "\n";
39}
40echo "現在の要素数: " . $list->count() . "\n\n";
41
42// `add` メソッドは、リストの現在のサイズと同じインデックスに要素を追加することもできます。
43// これは実質的に `push()` と同じ動作になります。
44// 例: 現在のリストの末尾に 'Kiwi' を追加します。
45$list->add($list->count(), 'Kiwi');
46
47echo "--- リストの末尾に 'Kiwi' を追加後 (add メソッドを使用) ---\n";
48foreach ($list as $key => $value) {
49    echo "  インデックス $key: " . $value . "\n";
50}
51echo "現在の要素数: " . $list->count() . "\n\n";
52
53?>

PHP 8のSplDoublyLinkedListは、要素の追加や削除を効率的に行える両方向アクセス可能なデータ構造を提供する標準拡張機能です。このクラスに属するaddメソッドは、リストの任意の指定インデックスに新しい要素を挿入する際に利用されます。

addメソッドは二つの引数を取ります。一つ目はint $indexで、これは要素を挿入したい位置を0から始まる整数で指定します。二つ目はmixed $valueで、実際にリストに挿入する任意の型の値です。

このメソッドを実行すると、指定された$indexの位置に$valueが挿入され、その位置にあった既存の要素やそれ以降の要素は、自動的に後方へシフトされます。例えば、インデックス1に要素を挿入すると、元のインデックス1にあった要素はインデックス2へ移動します。また、リストの現在の要素数と同じインデックスを指定すると、要素はリストの末尾に追加され、これはpushメソッドと同様の挙動になります。addメソッドはリストの状態を直接変更するため、戻り値は特にありません。このように、リストの途中に要素を柔軟に挿入できる点がaddメソッドの大きな特徴です。

SplDoublyLinkedListaddメソッドは、指定したインデックスに要素を「挿入」する点にご注意ください。既存の要素は後方にずらされ、上書きされるわけではありません。また、引数に指定するインデックスが現在のリストの要素数を超えるか、負の値の場合にはOutOfBoundsExceptionが発生する可能性がありますので、インデックスの範囲には十分な注意が必要です。このメソッドは、実行後に特定の値を返す戻り値がありません。リストの末尾に要素を追加する場合はpushメソッドも利用できますが、addはリスト内の任意の場所に柔軟に要素を挿入できる点が特徴です。

SplDoublyLinkedList::addで文字列を挿入する

1<?php
2
3// SplDoublyLinkedList は、両端から要素を追加・削除できるリンクリストです。
4// add メソッドは、指定されたインデックスに要素を挿入し、既存の要素をシフトさせます。
5
6// SplDoublyLinkedList のインスタンスを作成します。
7$list = new SplDoublyLinkedList();
8
9// キーワード「addslashes」に関連する文字列データを用意します。
10// この文字列には、シングルクォートやバックスラッシュなど、
11// addslashes関数によってエスケープされる特殊文字が含まれています。
12$originalString = "これは 'ユーザー入力' の例で、\\ファイルパス\\ や \"特別な文字\" も含まれます。";
13
14// addslashes() 関数を使用して、文字列内の特殊文字をエスケープします。
15// これは、文字列をデータベースに保存する前や、特定の形式で出力する前に行われる処理です。
16// (注意: データベース操作では、プリペアドステートメントの使用が推奨されます。)
17$escapedString = addslashes($originalString);
18
19echo "元の文字列: " . $originalString . PHP_EOL;
20echo "addslashes() でエスケープされた文字列: " . $escapedString . PHP_EOL . PHP_EOL;
21
22// SplDoublyLinkedList::add(int $index, mixed $value) メソッドを使用して、
23// エスケープされた文字列を指定したインデックスに挿入します。
24// ここでは、リストの先頭(インデックス 0)に挿入します。
25$list->add(0, $escapedString);
26echo "リストのインデックス 0 にエスケープされた文字列を追加しました。" . PHP_EOL;
27
28// 別の文字列をリストのインデックス 1 に挿入します。
29$list->add(1, "別の通常の文字列です。");
30echo "リストのインデックス 1 に別の文字列を追加しました。" . PHP_EOL;
31
32// 既存の要素をシフトさせながら、さらに別の文字列をインデックス 1 に挿入します。
33// これにより、「別の通常の文字列です。」はインデックス 2 に移動します。
34$list->add(1, "インデックス 1 に新しい文字列を挿入しました。");
35echo "リストのインデックス 1 に新しい文字列を挿入しました。" . PHP_EOL . PHP_EOL;
36
37// リストの内容を順番に表示して、追加と挿入の結果を確認します。
38echo "--- SplDoublyLinkedList の現在の内容 ---" . PHP_EOL;
39foreach ($list as $index => $value) {
40    echo "インデックス {$index}: " . $value . PHP_EOL;
41}
42echo "-------------------------------------" . PHP_EOL;
43
44// 特定のインデックスの要素に直接アクセスすることもできます。
45echo PHP_EOL;
46echo "インデックス 0 の要素 (エスケープ済み): " . $list->offsetGet(0) . PHP_EOL;
47echo "エスケープ後の文字列とリスト内の値が一致するか確認: " . ($list->offsetGet(0) === $escapedString ? "一致" : "不一致") . PHP_EOL;
48
49?>

PHP 8のSplDoublyLinkedListは、要素を両端から効率的に追加・削除できるリンクリストです。このクラスのaddメソッドは、リスト内の指定されたインデックスに新しい要素を挿入するために使用されます。add(int $index, mixed $value)という形式で、$indexには挿入したい位置を示す整数を、$valueには挿入する任意の型の値を指定します。このメソッドは、指定したインデックスに$valueを挿入し、その位置にあった既存の要素は後方に一つシフトさせます。戻り値はありません。

サンプルコードでは、まずaddslashes()関数を使って特殊文字を含む文字列をエスケープしています。これは、ウェブアプリケーションなどでユーザーからの入力を安全に処理する際によく行われる操作です。次に、このエスケープされた文字列をSplDoublyLinkedListaddメソッドを用いて、リストの先頭(インデックス0)に挿入しています。さらに、既存の要素がある状態でリストの中間(インデックス1)に別の文字列を挿入すると、既存の要素が自動的に後方に移動する挙動も確認できます。これにより、リスト内の任意の場所に柔軟に要素を追加し、動的にリストを構築できることが示されています。

SplDoublyLinkedList::addメソッドは、指定したインデックスに要素を挿入すると、既存要素が自動的にシフトし、その後の要素のインデックスがずれる点にご注意ください。これはリストの末尾への追加ではなく、途中への「挿入」の動作です。また、サンプルコードで使用されているaddslashes()関数は、文字列内の特殊文字をエスケープしますが、これはデータベースへのデータ保存におけるSQLインジェクション対策としては不十分です。セキュリティを確保するため、データベース操作ではPDOなどのプリペアドステートメントの使用が強く推奨されます。addslashes()は簡易的なエスケープやHTML出力など、限定的な用途で利用しましょう。

関連コンテンツ