リングキューは、配列の固定サイズを使用する線形データ構造です。キューの尾が配列の端に到達した後、アレイのヘッドからデータを保存して、スペースのリサイクルを実現し続けます。これにより、従来のキュー「データ転送」またはスペース廃棄物の問題を回避できます。
Array_sliceは、Arrayフラグメントを傍受するためにPHPが使用する関数であり、構文は次のとおりです。
array_slice(array $array, int $offset, ?int $length = null, bool $preserve_keys = false): array
配列から連続要素を簡単に抽出できます。それを使用して、アレイの異なるフラグメントを傍受し、それらをマージしてリング効果をシミュレートします。
具体的なアイデアは次のとおりです。
バッファーとして固定サイズの配列があるとします。
インデックスから始まるN連続した要素を読む必要があります。インデックスからアレイの端までのn要素未満がある場合、最初に尾の残りの要素を傍受し、次に頭から残りの部分を傍受し続けます。
最後に、2つの部分がマージされて「リング」読み取り効果を形成します。
<?php
// リングキューの読み取り関数
function circularQueueSlice(array $buffer, int $start, int $length): array {
$bufferSize = count($buffer);
$start = $start % $bufferSize; // 出発点が範囲内であることを確認してください
$endLength = $bufferSize - $start;
if ($length <= $endLength) {
// 段落を傍受するだけです
return array_slice($buffer, $start, $length);
} else {
// からstart配列の終わりまで
$part1 = array_slice($buffer, $start, $endLength);
// から数组开头截取剩余长度
$part2 = array_slice($buffer, 0, $length - $endLength);
// 2つの部分をマージします
return array_merge($part1, $part2);
}
}
// サンプルバッファデータ
$buffer = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'];
// から索引6読み始めます5要素,リングリーディング
$result = circularQueueSlice($buffer, 6, 5);
print_r($result);
?>
出力結果:
Array
(
[0] => G
[1] => H
[2] => A
[3] => B
[4] => C
)
ここでstart = 6は「g」から始まり、5つの要素を読み取り、最初に「g」、「h」を読み取り、次に「a」、「b」、「c」を頭から読み続けます。
リングキューは、バッファ管理、タスクポーリング、フロー制御、その他のシナリオに適しています。たとえば、ログファイルを読み取るときは、固定サイズのキャッシュを循環的に処理する必要があります。ループスケジューリングアルゴリズムを実装するとき、タスクリストはアクセスに順番に取得されます。
データストリーム処理にPHPを使用して、 array_sliceのリング切断方法と組み合わせて、固定容量ループキューを効率的に処理できます。
キューサイズは固定されており、重要なデータの上書きを防ぐために、挿入ポリシーをサイズを超えて制御する必要があります。
array_sliceは元の配列を変更せず、新しい配列を返します。
例外を回避するには、 $ startおよび$ lengthパラメーターの合理性を確保する必要があります。
PHPアレイ関数の使用の詳細については、 https://gitbox.net/manual/en/function.array-slice.phpにアクセスしてください。