php的標準庫提供了一些數據結構,例如堆棧、隊列等,下面我們寫的是一個優先隊列的demo,利用這個類,可以直接實現排序,下面看代碼,
1、實例化類,設置取出數據的時候,要數據還是要優先級,還是兩者都要,然後循環輸出,會自動排序好。
<?php
//優先隊列
$p1 = new \SplPriorityQueue();
$p1->setExtractFlags(SplPriorityQueue::EXTR_BOTH); //數據和優先級都要
// $p1->setExtractFlags(SplPriorityQueue::EXTR_DATA); //只要數據
// $p1->setExtractFlags(SplPriorityQueue::EXTR_PRIORITY); //只要優先級
$p1->insert('mrtwenty', 91);
$p1->insert('dazhaozhao', 98);
$p1->insert('ming', 90);
//循環取出,默認最大值到最小
foreach ($p1 as $value) {
var_dump($value);
}
2、如果需要更換排序規則,可以繼承並重寫類的compare方法
<?php
//優先隊列
class MinSplPriorityQueue extends \SplPriorityQueue
{
public function compare($a, $b)
{
return $b - $a;
}
}
$p1 = new MinSplPriorityQueue();
$p1->setExtractFlags(SplPriorityQueue::EXTR_BOTH); //數據和優先級都要
// $p1->setExtractFlags(SplPriorityQueue::EXTR_DATA); //只要數據
// $p1->setExtractFlags(SplPriorityQueue::EXTR_PRIORITY); //只要優先級
$p1->insert('mrtwenty', 91);
$p1->insert('dazhaozhao', 98);
$p1->insert('ming', 90);
//循環取出,默認最大值到最小
foreach ($p1 as $value) {
var_dump($value);
}
3、如果需要統計個數,可以直接使用count方法
<?php
//優先隊列
$p1 = new \SplPriorityQueue();
$p1->setExtractFlags(SplPriorityQueue::EXTR_BOTH); //數據和優先級都要
// $p1->setExtractFlags(SplPriorityQueue::EXTR_DATA); //只要數據
// $p1->setExtractFlags(SplPriorityQueue::EXTR_PRIORITY); //只要優先級
$p1->insert('mrtwenty', 91);
$p1->insert('dazhaozhao', 98);
$p1->insert('ming', 90);
echo $p1->count();
4、extract和top方法會取出最高的值,兩者有區別,extract會出隊,top不會。
<?php
//優先隊列
$p1 = new \SplPriorityQueue();
$p1->setExtractFlags(SplPriorityQueue::EXTR_BOTH); //數據和優先級都要
// $p1->setExtractFlags(SplPriorityQueue::EXTR_DATA); //只要數據
// $p1->setExtractFlags(SplPriorityQueue::EXTR_PRIORITY); //只要優先級
$p1->insert('mrtwenty', 91);
$p1->insert('dazhaozhao', 98);
$p1->insert('ming', 90);
//獲取最高值,不出隊
$res = $p1->top();
var_dump($res);
echo $p1->count() . "\n";
//獲取最高值,出隊
$res = $p1->extract();
var_dump($res);
echo $p1->count();