SplPriorityQueue, упорядоченный по возрастанию - PullRequest
1 голос
/ 02 марта 2011

Ниже показано, что SplPriorityQueue отдает наивысший приоритет наибольшему значению приоритета, которое в данном случае соответствует самой последней дате.

$q=new SplPriorityQueue();
foreach(range(1,5) as $i){
    $s='2011-03-' . (1+$i);
    $d=date_create($s);
    echo $i, ' ',  $d->format('Y-m-d'),'<br/>';
    $q->insert($i,$d);
}

/*
1 2011-03-02
2 2011-03-03
3 2011-03-04
4 2011-03-05
5 2011-03-06
*/

foreach($q as $i){
    echo "$i ";
}

//5 4 3 2 1 

Учитывая произвольный набор дат в качестве приоритетов, как можно заставить содержимое SplPriorityQueue появляться в возрастающем , а не в порядке убывания даты?

ETA: У меня есть хитрый способ использовать метки времени Unix. Но это выходит за рамки эпохи Unix.

$q=new SplPriorityQueue();
foreach(range(1,5) as $i){
    $s='2011-03-' . (1+$i);
    $d=date_create($s);
    $u=$d->format('U');
    echo $i, ' ',  $d->format('Y-m-d'), ' ',-$u,'<br/>';
    $q->insert($i,-$u);
}

/*
1 2011-03-02 -1299038400
2 2011-03-03 -1299124800
3 2011-03-04 -1299211200
4 2011-03-05 -1299297600
5 2011-03-06 -1299384000
*/

foreach($q as $i){
    echo "$i ";
}
//1 2 3 4 5 

Есть ли более надежный способ?

1 Ответ

1 голос
/ 03 марта 2011

Как насчет заказа по (99999999-ггггммдд)?

Взглянув на руководство, представляется, что рекомендуемый способ изменить сортировку - расширить стандартный класс и предоставить собственную функцию SplPriorityQueue :: compare .

...