2016-03-29 11 views
0

Ich habe ein Array mit mehreren Objekten erstellt, diese Objekte haben eine StartTime und eine EndTime. zuerst muss ich die niedrigste Startzeit und dann die higest endTimeWeird Usort Verhalten

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

So für dieses Beispiel die niedrigste Startzeit wäre „2016.03.24 07.25.50“ und der höchste endTime wäre „2016-03- 24 07:25:50 ". Aber das Seltsame ist, dass dies nicht (immer) das Ergebnis ich erhalte (3 von 5 mal)

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

ich diese Objekte bestellen usort auf dem Attribut Startzeit basiert. Hier te Code ich verwende

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

Zusatzinfo: Dies ist ein Yü Projekt, PHP Version 5.4.40, OS Centos, Apache 2.0

Antwort

0

Per the docs„micro() gibt die Strom Unix-Zeitstempel mit Mikrosekunden " (Hervorhebung hinzugefügt). Der einzige Parameter, der benötigt wird, ist ein boolescher Wert $get_as_float. Sie sortieren also nicht nach den Zeiten der Artikel, sondern nach (in etwa) ihrer Reihenfolge.

Sie können DateTime-Objekte erstellen und ihre Zeitstempel vergleichen. Wenn Sie jedoch sicher das Format sind dann könnte man die Tatsache ausnutzen, dass für ISO-Format Daten, alphabetisch sortiert und Datum geordnet die gleiche Sache sind ...

Also ich denke, statt

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

Sie wollen so etwas wie

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

oder alternativ

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

Achtung: nicht teste d, sollte aber funktionieren.

+0

Danke Mann, das war ziemlich offensichtlich ... ich wollte mit strtotime() func den Vergleich machen. – Tim