优先队列也是非常实用的一种数据结构,可以通过加权对值进行排序,由于排序在php内部实现,业务代码中将精简不少而且更高效。通过SplPriorityQueue::setExtractFlags(int $flag)设置提取方式可以提取数据(等同最大堆)、优先级、和两者都提取的方式。
<?php
$queue = new SplPriorityQueue();
/**
* $queue->insert(value, priority)
* value 值
* priority 优先级
*/
$queue->insert(1, '111');
$queue->insert(2, '22');
$queue->insert(3, '33');
$queue->insert(4, '44');
$queue->insert('a', 10);
$queue->insert('b', 1);
$queue->insert('c', 8);
/**
* 设置元素出队模式
* SplPriorityQueue::EXTR_DATA 仅提取值
* SplPriorityQueue::EXTR_PRIORITY 仅提取优先级
* SplPriorityQueue::EXTR_BOTH 提取数组包含值和优先级
*/
$queue->setExtractFlags(SplPriorityQueue::EXTR_PRIORITY);
var_dump($queue->current()); //输出 4
$queue->setExtractFlags(SplPriorityQueue::EXTR_DATA);
var_dump($queue->current()); //输出 1
$queue->setExtractFlags(SplPriorityQueue::EXTR_BOTH);
var_dump($queue->current()); //输出 ['data' => 1, 'priority' => 111];
while ($queue->valid()){
var_dump($queue->current());
$queue->next();
}