PHP 大会日本 2024

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>";

//提取模式
$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 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('带有通知类型的消息', Logger::NOTICE);
$logger->addMessage('带有警告类型的消息', Logger::WARNING);
$logger->addMessage('带有错误类型的消息', Logger::ERROR);

$priorityLoggerQueue = $logger->getPriorityLogger();

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

//结果
//带有错误类型的消息
//带有警告类型的消息
//带有通知类型的消息
?>
To Top