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

【PHP8.x】SplPriorityQueue::EXTR_BOTH定数の使い方

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

作成日: 更新日:

基本的な使い方

EXTR_BOTH定数は、PHPのSplPriorityQueueクラスにおいて、キューから要素を取り出す際の挙動を制御するために使用される定数です。SplPriorityQueueは、要素に優先度を付けて管理する特殊なキューであり、最も優先度の高い要素から順に取り出すことができます。

この定数は、SplPriorityQueueextract()メソッドやsetExtractFlags()メソッドに指定することで効果を発揮します。EXTR_BOTHが設定されている状態でextract()メソッドを呼び出すと、キューから取り出される要素の「データ本体」と、その要素に紐付けられた「優先度」の両方を一度に取得できます。

具体的には、取り出された要素は連想配列として返され、その配列には'data'キーに対応する要素のデータと、'priority'キーに対応する要素の優先度の両方が含まれます。これにより、キューから要素を取り出す際に、データだけでなく、そのデータの重要度や順番を決めていた優先度も同時に確認し、処理に活用することが可能になります。例えば、タスクとその重要度を同時に取得して、より詳細な処理を行う場合などに非常に役立つ定数です。

構文(syntax)

1<?php
2$priorityQueue->setExtractFlags(SplPriorityQueue::EXTR_BOTH);

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHP SplPriorityQueue EXTR_BOTHで抽出する

1<?php
2
3/**
4 * SplPriorityQueue::EXTR_BOTH 定数を使用して、
5 * 優先度キューから要素と優先度の両方を抽出する方法を示すサンプルコードです。
6 *
7 * SplPriorityQueue は、要素に優先度を付けて管理するデータ構造です。
8 * extract() メソッドはキューから最も優先度の高い要素を取り出します。
9 * EXTR_BOTH フラグを設定すると、要素とその優先度の両方を配列で取得できます。
10 */
11function demonstrateSplPriorityQueueExtractBoth(): void
12{
13    // 優先度付きキューのインスタンスを作成します
14    $pq = new SplPriorityQueue();
15
16    // 抽出フラグを SplPriorityQueue::EXTR_BOTH に設定します。
17    // これにより、extract() メソッドは要素とその優先度の両方を
18    // ['data' => 要素, 'priority' => 優先度] の形式の配列として返します。
19    // フラグを設定しない場合、デフォルトでは要素のみが返されます。
20    $pq->setExtractFlags(SplPriorityQueue::EXTR_BOTH);
21
22    // 要素を優先度と共にキューに追加します
23    // insert(データ, 優先度)
24    // 優先度が高い(数値が大きい)ものほど先に抽出されます
25    echo "キューに要素を追加します:\n";
26    echo "  - 'タスクA' (優先度: 10)\n";
27    $pq->insert('タスクA', 10); // 優先度中
28    echo "  - 'タスクB' (優先度: 5)\n";
29    $pq->insert('タスクB', 5);  // 優先度低
30    echo "  - 'タスクC' (優先度: 20)\n";
31    $pq->insert('タスクC', 20); // 優先度高
32    echo "  - 'タスクD' (優先度: 1)\n";
33    $pq->insert('タスクD', 1);  // 優先度最低
34    echo "\n";
35
36    echo "キューから優先度が高い順に要素を抽出します:\n";
37
38    // キューに有効な要素がある間、ループで要素を抽出します
39    while ($pq->valid()) {
40        // extract() メソッドで最も優先度の高い要素を取り出します。
41        // EXTR_BOTH が設定されているため、要素と優先度の両方が配列で返されます。
42        $extractedItem = $pq->extract();
43
44        // 抽出された配列からデータと優先度を取り出して表示します
45        echo "  抽出: データ = '" . $extractedItem['data'] . "', 優先度 = " . $extractedItem['priority'] . "\n";
46    }
47
48    echo "\nキューは空になりました。\n";
49}
50
51// サンプル関数を実行します
52demonstrateSplPriorityQueueExtractBoth();

PHP 8におけるSplPriorityQueue::EXTR_BOTH定数は、優先度付きキューから要素を取り出す際の挙動を制御するためのものです。SplPriorityQueueは、要素に優先度を付けて管理する特殊なキューであり、高い優先度の要素から順に取り出されます。この定数自体には引数や戻り値はありませんが、setExtractFlags()メソッドに設定することで、その後のextract()メソッドの動作を変更します。

通常、extract()メソッドはキューから最も優先度の高い「要素」のみを返しますが、SplPriorityQueue::EXTR_BOTHをフラグとして設定すると、要素だけでなくその「優先度」も一緒に取得できるようになります。具体的には、extract()メソッドは['data' => 要素, 'priority' => 優先度]という形式の連想配列を返します。

サンプルコードでは、まずSplPriorityQueueのインスタンスを作成し、setExtractFlags(SplPriorityQueue::EXTR_BOTH)で抽出フラグを設定しています。これにより、extract()は要素と優先度の両方を返します。次に、異なる優先度を持つ複数のタスクをキューに追加しています。ループ処理でvalid()メソッドが真である間、extract()を呼び出してキューから要素を取り出します。抽出された結果は、データと優先度の両方を含む配列として得られるため、それぞれの値を取り出して表示することができます。これにより、優先度の高い「タスクC」(優先度20)から順に、データと優先度の両方を確認しながら要素が抽出されていく様子がわかります。

このコードは、優先度キューから要素とその優先度を同時に取り出す方法を示しています。SplPriorityQueue::EXTR_BOTH定数は、setExtractFlags()メソッドで設定し、extract()メソッドが要素とその優先度の両方を、['data' => 要素, 'priority' => 優先度]という連想配列形式で返すように動作します。このフラグを設定しない場合、extract()はデフォルトで要素のみを返すため、両方が必要な場合は必ず設定してください。抽出される配列のキーが'data''priority'である点も覚えておくと良いでしょう。また、SplPriorityQueueでは優先度の数値が大きいほど高い優先度として扱われ、先に抽出されます。キューが空になるまでvalid()メソッドで確認しながらextract()を呼び出すことが、安全かつ正しい利用方法です。

SplPriorityQueue::EXTR_BOTHで要素を両方取得する

1<?php
2
3/**
4 * SplPriorityQueue::EXTR_BOTH 定数の使用例を示す関数。
5 *
6 * この定数は、SplPriorityQueue から要素を取り出す際に、
7 * 値と優先度の両方を配列として取得できるように設定するために使用されます。
8 * SplPriorityQueue はPHPの標準拡張(SPL)の一部です。
9 */
10function demonstrateSplPriorityQueueExtractBoth(): void
11{
12    // SplPriorityQueue のインスタンスを作成します。
13    $queue = new SplPriorityQueue();
14
15    // setExtractFlags() メソッドで抽出フラグを設定します。
16    // SplPriorityQueue::EXTR_BOTH を設定すると、extract() メソッドが
17    // ['data' => 要素の値, 'priority' => 要素の優先度] の形式で配列を返します。
18    $queue->setExtractFlags(SplPriorityQueue::EXTR_BOTH);
19
20    // キューに要素を優先度付きで追加します。
21    // (値, 優先度) のペアで追加します。優先度が高いほど先に取り出されます。
22    $queue->insert('重要なタスク', 5);
23    $queue->insert('通常のタスク', 3);
24    $queue->insert('低優先度タスク', 1);
25    $queue->insert('緊急タスク', 10);
26
27    echo "キューから要素を優先度の高い順に取り出します:\n";
28
29    // キューが空になるまで要素を取り出し、表示します。
30    // EXTR_BOTH フラグにより、各要素はデータと優先度を含む配列として取得されます。
31    while (!$queue->isEmpty()) {
32        $item = $queue->extract(); // 配列 ['data' => ..., 'priority' => ...] が返されます
33        echo "  - データ: " . $item['data'] . ", 優先度: " . $item['priority'] . "\n";
34    }
35}
36
37// 関数を実行して動作を確認します。
38demonstrateSplPriorityQueueExtractBoth();
39

SplPriorityQueue::EXTR_BOTHは、PHPの標準拡張(SPL)の一部であるSplPriorityQueueクラスで利用される定数です。SplPriorityQueueは、要素を優先度付きで管理し、最も優先度の高いものから順に取り出すためのデータ構造です。

このEXTR_BOTH定数自体には引数や戻り値はありませんが、SplPriorityQueuesetExtractFlags()メソッドの引数として使用することで、キューから要素を取り出す際の形式を設定します。EXTR_BOTHを設定すると、extract()メソッドが、取り出した要素の「値」と「優先度」の両方を含む連想配列として結果を返します。この配列は、['data' => 要素の値, 'priority' => 要素の優先度]という形式になります。

サンプルコードでは、まずSplPriorityQueueのインスタンスを作成し、setExtractFlags(SplPriorityQueue::EXTR_BOTH)で抽出フラグを設定しています。これにより、要素を取り出す際にデータと優先度を同時に取得できるようになります。その後、複数のタスクを優先度(数値が大きいほど高優先度)と共にキューに追加します。キューが空になるまでextract()メソッドで要素を取り出すと、各要素が値と優先度を含む配列として取得され、それぞれの情報を個別に表示することができます。この定数を利用することで、データの値だけでなく、その優先度も考慮しながら効率的に要素を処理することが可能になります。

このサンプルコードで最も重要な注意点は、setExtractFlags(SplPriorityQueue::EXTR_BOTH)を呼び出すことです。この設定がない場合、extract()メソッドは要素の値のみを返し、優先度は取得できません。また、EXTR_BOTHを設定した際のextract()の戻り値は、['data' => 値, 'priority' => 優先度]形式の連想配列となるため、$item['data']のように正しいキーでアクセスする必要があります。キューから要素を取り出す際は、isEmpty()メソッドでキューが空でないことを必ず確認してからextract()を呼び出すことで、エラーを防ぎ安全に利用できます。この機能はPHPの標準拡張(SPL)の一部であるため、特別なインストールは不要です。

関連コンテンツ

関連プログラミング言語