首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >怪异的Usort行为

怪异的Usort行为
EN

Stack Overflow用户
提问于 2016-03-29 14:41:07
回答 1查看 120关注 0票数 0

我已经创建了一个包含多个对象的数组,这些对象有一个startTime和一个endTime。首先我需要最低的startTime,然后是最高的endTime

代码语言:javascript
复制
array{
   [1541] =>  object(task)#430 (2){ ["startTime"]=> string(19) "2016-03-24 06:29:35" ["endTime"]=> string(19) "2016-03-24 06:31:35"}
   [1545] =>  object(task)#431 (2){ ["startTime"]=> string(19) "2016-03-24 07:20:50" ["endTime"]=> string(19) "2016-03-24 07:25:50"}
}

因此,对于这个例子,最低的startTime是"2016-03-24 07:25:50“,而最高的endTime是"2016-03-24 07:25:50”。但奇怪的是,这并不是我所得到的结果(5次中有3次)

代码语言:javascript
复制
the result is lowest startTime is "2016-03-24 07:25:50" and the highest endTime is "2016-03-24 06:29:35"

我根据startTime属性使用usort对这些对象进行排序。这是我正在使用的te代码

代码语言:javascript
复制
class StaticsComponent extends CComponent  {

    public static  function cmp_start($a, $b) {
        if (microtime($a->startTime) == microtime($b->startTime)) {
           return 0;
        }
        return (microtime($a->startTime) > microtime($b->startTime)) ? -1 : 1;
    }
    public static  function cmp_end($a, $b) {
        if (microtime($a->startTime) == microtime($b->startTime)) {
           return 0;
        }
        return (microtime($a->startTime) < microtime($b->startTime)) ? -1 : 1;
    }

}

class OrderBcStats extends Orderbc {
    public $tasks;

    public $startTime;
    public $endTime;

    public function process(){
        if(empty($this->tasks)){
           return;
        }
        $starts = $this->tasks;
        $ends = $this->tasks;

        usort($starts, array('StaticsComponent','cmp_start'));
        usort($ends, array('StaticsComponent','cmp_end'));

        $first = reset($starts);
        $last = end($ends);

        $this->startTime = $first->startTime;
        $this->endTime = $last->endTime;
    }
}

附加信息:这是一个Yii项目,PHP版本5.4.40,OS,Apache2.0

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-29 16:05:18

根据医生们,"microtime()返回带有微秒的当前 Unix时间戳“(重点是添加的)。它所采用的唯一参数是布尔$get_as_float。所以,你不是按照商品的时间排序,而是按照它们的顺序排序。

您可以创建DateTime对象并比较它们的时间戳。但是,如果您确定格式,那么您可以利用以下事实:对于ISO格式日期,字母顺序和日期顺序是相同的.

所以我想不是

代码语言:javascript
复制
        if (microtime($a->startTime) == microtime($b->startTime)) {
           return 0;
        }
        return (microtime($a->startTime) > microtime($b->startTime)) ? -1 : 1;

你想要的东西

代码语言:javascript
复制
if ($a->startTime == $b->startTime) {
   return 0;
}
return ($a->startTime > $b->startTime) ? -1 : 1;

或者另一种

代码语言:javascript
复制
$a_time = new DateTime($a->startTime);
$b_time = new DateTime($a);
if ($a_time == $b_time) {
   return 0;
}
return ($a_time > $b_time) ? -1 : 1;   

警告:没有测试,但应该有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36287545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档