SplPriorityQueue 类

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

简介

SplPriorityQueue 类提供了优先级队列的主要功能,使用最大堆实现。

注意: 具有相同优先级的元素的顺序是未定义的。 它可能与插入顺序不同。

类概要

class SplPriorityQueue implements Iterator, Countable {
/* 常量 */
public const int EXTR_BOTH;
public const int EXTR_PRIORITY;
public const int EXTR_DATA;
/* 方法 */
public compare(mixed $priority1, mixed $priority2): int
public count(): int
public current(): mixed
public extract(): mixed
public insert(mixed $value, mixed $priority): true
public isCorrupted(): bool
public isEmpty(): bool
public key(): int
public next(): void
public rewind(): void
public setExtractFlags(int $flags): int
public top(): mixed
public valid(): bool
}

目录

添加笔记

用户贡献笔记 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>";

//mode of extraction
$objPQ->setExtractFlags(PQtest::EXTR_BOTH);

//Go to TOP
$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 at gmail dot com
10 年前
<?php

/**
* PriorityQueue 的描述
*
* (c) lsroudi http://lsroudi.com/ <[email protected]>
*
* 完整的版权和许可信息,请查看与该源代码一起发布的 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('Message with notice type', Logger::NOTICE);
$logger->addMessage('Message with warning type', Logger::WARNING);
$logger->addMessage('Message with error type', Logger::ERROR);

$priorityLoggerQueue = $logger->getPriorityLogger();

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

//Résultat
//Message with error type
//Message with warning type
//Message with notice type
?>
To Top