PHP Conference Japan 2024

SplPriorityQueue 類別

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

簡介

SplPriorityQueue 類別提供了優先佇列的主要功能,使用最大堆積 (max heap) 實作。

注意具有相同優先順序的元素順序是*未定義的*。它可能與它們插入的順序不同。

類別概要

class SplPriorityQueue implements Iterator, Countable {
/* 常數 */
public const int EXTR_BOTH;
public const int EXTR_PRIORITY;
public const int EXTR_DATA;
/* 方法 */
public compare(混合型別 $priority1, 混合型別 $priority2): 整數
public count(): 整數
public insert(混合型別 $value, 混合型別 $priority): true
public isEmpty(): 布林值
public key(): 整數
public next():
public rewind():
public setExtractFlags(整數 $flags): 整數
public top(): 混合型別
public valid(): 布林值
}

目錄

新增註記

使用者貢獻的註記 4 則註記

doublecompile at gmail dot com
9 年前
我使用 SplPriorityQueue 來決定 HTTP 用戶端偏好的 MIME 類型。

<?php
$queue
= new \SplPriorityQueue();
foreach (
preg_split('#,\s*#', $_SERVER['HTTP_ACCEPT']) as $accept) {
$split = preg_split('#;\s*q=#', $accept, 2);
$queue->insert($split[0], isset($split[1]) ? (float)$split[1] : 1.0);
}
foreach (
$queue as $mime) {
echo
$mime, PHP_EOL;
}
?>

我的瀏覽器傳送
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

而這個程式碼輸出
text/html
application/xhtml+xml
application/xml
*/*

一個更好的例子
Accept: text/html, application/xml,text/css;q=0.4,text/plain; q=0.9, application/json;q=0.8

而這個程式碼輸出
text/html
application/xml
text/plain
application/json
text/css
rajatn at rediff dot co dot in
14 年前
SPL 優先佇列的快速實作

<?php

class PQtest extends SplPriorityQueue
{
public function
compare($priority1, $priority2)
{
if (
$priority1 === $priority2) return 0;
return
$priority1 < $priority2 ? -1 : 1;
}
}

$objPQ = new PQtest();

$objPQ->insert('A',3);
$objPQ->insert('B',6);
$objPQ->insert('C',1);
$objPQ->insert('D',2);

echo
"COUNT->".$objPQ->count()."<BR>";

//擷取模式
$objPQ->setExtractFlags(PQtest::EXTR_BOTH);

//移至頂端
$objPQ->top();

while(
$objPQ->valid()){
print_r($objPQ->current());
echo
"<BR>";
$objPQ->next();
}

?>

輸出結果

COUNT->4
Array ( [data] => B [priority] => 6 )
Array ( [data] => A [priority] => 3 )
Array ( [data] => D [priority] => 2 )
Array ( [data] => C [priority] => 1 )
Hayley Watson
10 年前
要讓基於堆積的優先佇列發揮最大效用,「優先順序」應該是可以採用廣泛值的東西(長度、時間戳記、數量)。它最佳化了在佇列中搜尋插入項目的適當位置(並插入它)以及移除列表中第一個項目的任務。

項目可能會插入到佇列中任何兩個相鄰項目具有不同優先順序的位置。當列表中存在許多分散的插入點時,堆積結構是一種有效索引這些插入點的方法。

如果您只有數量非常有限的可能優先級值,那麼插入點也非常少,每個優先級值都對應一個插入點。在這種情況下,您可以將插入點明確化(從而無需維護堆積來索引它們),方法是將您的優先級佇列實現為一個簡單佇列的列表,您可以從中依次從最高優先級的非空佇列中提取項目。
lsroudi@gmail.com
10 年前
<?php

/**
* PriorityQueue 的說明
*
* (c) lsroudi http://lsroudi.com/ <lsroudi@gmail.com>
*
* 完整的版權及授權資訊,請參閱隨附於此原始碼的 LICENSE
* 檔案。
*/
interface PriorityLoggerInterface {

public function
insert($value, $priority);
}

class
PriorityLogger extends SplPriorityQueue implements PriorityLoggerInterface {

}

class
Logger {

const
ERROR = 3;
const
NOTICE = 1;
const
WARNING = 2;

private
$priorityLogger;

public function
__construct(PriorityLoggerInterface $priorityLogger)
{
$this->priorityLogger = $priorityLogger;
}

public function
addMessage($value, $priority)
{
$this->priorityLogger->insert($value, $priority);
}

public function
getPriorityLogger()
{
return
$this->priorityLogger;
}

}

$priorityLogger = new PriorityLogger();

$logger = new Logger($priorityLogger);
$logger->addMessage('通知類型的訊息', Logger::NOTICE);
$logger->addMessage('警告類型的訊息', Logger::WARNING);
$logger->addMessage('錯誤類型的訊息', Logger::ERROR);

$priorityLoggerQueue = $logger->getPriorityLogger();

foreach (
$priorityLoggerQueue as $queue){
print
$queue . PHP_EOL;
}

//結果
//錯誤類型的訊息
//警告類型的訊息
//通知類型的訊息
?>
To Top