【问题标题】:SplPriorityQueue ordered by ascending dateSplPriorityQueue 按升序排列
【发布时间】:2011-03-02 17:31:59
【问题描述】:

下图显示,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 的内容以升序而不是降序日期顺序出现?

预计到达时间: 我有一种使用 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 

有没有更稳健的方法?

【问题讨论】:

    标签: php data-structures spl


    【解决方案1】:

    按 (99999999- yyyymmdd) 订购怎么样?

    查看手册后,更改排序的推荐方法似乎是扩展标准类,并提供您自己的SplPriorityQueue::compare 函数。

    【讨论】:

    • 这绝对是比 Unix 纪元更好的范围。出于实际目的,它解决了问题。我想我只需要吞下我对实例化 SplPriorityQueue 时无法将排序顺序设置为升序或降序这一事实的不满。
    • 使用PHP_MAX_INT而不是99999999
    • PHP_INT_MAX 在 32 位和 64 位上是不同的。还。我建议使用 99999999,因为它与 yyyymmdd 的位数相同,并且结果仍然可以与原始结果进行比较
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 2013-10-14
    • 2012-07-30
    • 1970-01-01
    • 2011-08-25
    • 2019-07-23
    相关资源
    最近更新 更多