This is a naive but functional Priority Queue data structure implemented  with only xDict:<br>
 
<?php
 
highlight_string('
 
<?php
 
require_once(\'./../xdict.class.php\');
 
class PriorityQueue  implements Iterator,Countable ,JsonSerializable{
 
 
    private $xdict=null;
 
 
    public function __construct(){
 
            $this->xdict=xdict(0);
 
            $this->xdict->return_array_type=true;
 
    }
 
    
 
    
 
    function rewind() {
 
        return $this->xdict->rewind();
 
    }
 
 
    function current() {
 
         return $this->xdict->current()[0];
 
    }
 
 
    function key() {
 
        return $this->xdict->key();
 
    }
 
 
    function next() {
 
        $x=$this->xdict->next()[0];
 
        $this->xdict->shift();
 
        return $x;
 
    }
 
 
    function valid() {
 
         return $this->xdict->valid();
 
    }
 
    public function clear (){
 
        return $this->xdict->clear();
 
    }
 
    public function count(){
 
            return $this->xdict->count();
 
    }
 
    
 
    public function copy (){
 
        return clone($this);
 
    }
 
    public function isEmpty (){
 
        return $this->xdict->isEmpty();
 
    }
 
    public function peek (){
 
        return $this->xdict->first()[0];
 
    }
 
    public function pop (){
 
        if($this->isEmpty()) throw new UnderflowException(\'The queue is already empty\');
 
        return $this->xdict->shift(true)[0];
 
    }
 
    public function push ($value,$priority ){
 
        if($this->isEmpty()){
 
            $this->xdict->push([$value,$priority]);
 
        }else{
 
            if(in_array($value,$this->xdict->column(0))) return;//you can remove this to authorize the same value with different priority values in queue
 
            $this->xdict->push([$value,$priority]);
 
            while(!$this->xdict->isEmpty()){
 
                $copy[]=$this->xdict->shift();
 
            }
 
            $c0=array_column($copy,1); 
 
            $c1=array_keys($copy);
 
            array_multisort($c0,SORT_NUMERIC,SORT_DESC,$c1,SORT_NUMERIC,SORT_ASC,$copy);
 
            $this->xdict->fill_with($copy);
 
        }
 
    }
 
    
 
    public function toArray (){
 
        return $this->xdict->column(0);
 
    }
 
 
    public function __debugInfo(){
 
        return $this->xdict->column(0);
 
    }    
 
    
 
    public function jsonSerialize() {
 
        $anonymous=function(&$v){
 
            if(is_object($v)) $v=serialize($v);
 
            if(is_resource($v)) $v=get_resource_type($v).\'_#\'.@intval($v);
 
        };
 
        $x=$this->xdict->column(0);
 
        array_walk_recursive($x,$anonymous);
 
        return $x;
 
    }
 
    public  function __clone() {    
 
        $this->xdict = clone ($this->xdict);
 
     }
 
}
 
 
echo \'<pre>\';
 
$queue = new PriorityQueue();
 
 
$queue->push("a",  5);
 
$queue->push("c", 10);
 
$queue->push("b", 10);
 
$queue->push("d",  5);
 
$queue->push("y", 15);
 
$queue->push("y", 2);
 
$queue->push("8", 4);
 
$queue->push("9", 4);
 
var_dump($queue);
 
 
var_dump(
 
$queue->pop(),
 
$queue->pop(),
 
$queue->pop()
 
);
 
 
var_dump($queue);
 
 
foreach($queue as $v){
 
        echo $v.\'<br>\';
 
}
 
    
 
    var_dump($queue);
 
echo \'</pre>\';
 
?>');
 
require_once('./../xdict.class.php');
 
class PriorityQueue  implements Iterator,Countable ,JsonSerializable{
 
 
    private $xdict=null;
 
 
    public function __construct(){
 
            $this->xdict=xdict(0);
 
            $this->xdict->return_array_type=true;
 
    }
 
    
 
    
 
    function rewind() {
 
        return $this->xdict->rewind();
 
    }
 
 
    function current() {
 
         return $this->xdict->current()[0];
 
    }
 
 
    function key() {
 
        return $this->xdict->key();
 
    }
 
 
    function next() {
 
        $x=$this->xdict->next()[0];
 
        $this->xdict->shift();
 
        return $x;
 
    }
 
 
    function valid() {
 
         return $this->xdict->valid();
 
    }
 
    public function clear (){
 
        return $this->xdict->clear();
 
    }
 
    public function count(){
 
            return $this->xdict->count();
 
    }
 
    
 
    public function copy (){
 
        return clone($this);
 
    }
 
    public function isEmpty (){
 
        return $this->xdict->isEmpty();
 
    }
 
    public function peek (){
 
        return $this->xdict->first()[0];
 
    }
 
    public function pop (){
 
        if($this->isEmpty()) throw new UnderflowException('The queue is already empty');
 
        return $this->xdict->shift(true)[0];
 
    }
 
    public function push ($value,$priority ){
 
        if($this->isEmpty()){
 
            $this->xdict->push([$value,$priority]);
 
        }else{
 
            if(in_array($value,$this->xdict->column(0))) return;//you can remove this to authorize the same value with different priority values in queue
 
            $this->xdict->push([$value,$priority]);
 
            while(!$this->xdict->isEmpty()){
 
                $copy[]=$this->xdict->shift();
 
            }
 
            $c0=array_column($copy,1); 
 
            $c1=array_keys($copy);
 
            array_multisort($c0,SORT_NUMERIC,SORT_DESC,$c1,SORT_NUMERIC,SORT_ASC,$copy);
 
            // var_dump($copy);
 
            $this->xdict->fill_with($copy,false);
 
            // var_dump($this);
 
        }
 
    }
 
    
 
    public function toArray (){
 
        return $this->xdict->column(0);
 
    }
 
 
    public function __debugInfo(){
 
        return $this->xdict->column(0);
 
    }    
 
    
 
    public function jsonSerialize() {
 
        $anonymous=function(&$v){
 
            if(is_object($v)) $v=serialize($v);
 
            if(is_resource($v)) $v=get_resource_type($v).'_#'.@intval($v);
 
        };
 
        $x=$this->xdict->column(0);
 
        array_walk_recursive($x,$anonymous);
 
        return $x;
 
    }
 
    public  function __clone() {    
 
        $this->xdict = clone ($this->xdict);
 
     }
 
}
 
 
echo '<pre>';
 
$queue = new PriorityQueue();
 
 
$queue->push("a",  5);
 
$queue->push("c", 10);
 
$queue->push("b", 10);
 
$queue->push("d",  5);
 
$queue->push("y", 15);
 
$queue->push("y", 2);
 
$queue->push("8", 4);
 
$queue->push("9", 4);
 
var_dump($queue);
 
 
var_dump(
 
$queue->pop(),
 
$queue->pop(),
 
$queue->pop()
 
);
 
 
var_dump($queue);
 
 
foreach($queue as $v){
 
        echo $v.'<br>';
 
}
 
    
 
    var_dump($queue);
 
echo '</pre>';
 
 |