2016-03-29 226 views
0

我創建了一個包含多個對象的數組,這些對象有一個startTime和一個endTime。首先我需要最低的開始時間,然後higest結束時間奇怪的使用行爲

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"} 
} 

所以在這個例子中最低的開始時間是「2016年3月24日七點25分50秒」和最高的結束時間將是「2016-03- 24 07:25:50「。但奇怪的是,這不是(總是)結果我得到(3出5次)

the result is lowest startTime is "2016-03-24 07:25:50" and the highest endTime is "2016-03-24 06:29:35" 

我命令使用基於開始時間屬性usort這些對象。這裏是TE代碼我使用

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的Centos,阿帕奇

回答

0

按2.0 the docs「microtime中()返回當前 Unix微秒時間戳「(強調增加)。唯一的參數是一個布爾值$get_as_float。所以你不是根據物品的時間進行排序,而是根據(大致)他們的順序進行排序。

您可以創建DateTime對象並比較它們的時間戳。但是,如果你有一定的格式,那麼你可以利用以下事實:爲ISO格式的日期,按字母順序和日期的順序是一樣的...

所以我想,而不是

 if (microtime($a->startTime) == microtime($b->startTime)) { 
      return 0; 
     } 
     return (microtime($a->startTime) > microtime($b->startTime)) ? -1 : 1; 

你要像

if ($a->startTime == $b->startTime) { 
    return 0; 
} 
return ($a->startTime > $b->startTime) ? -1 : 1; 

或可替代

$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; 

警告:不泰斯特d,但應該工作。

+0

謝謝你,這是非常明顯的...我打算使用strtotime()函數做比較。 – Tim