Ben nesneleri bir dizi sıralamak için bir kullanıcı karşılaştırma fonksiyonu ile usort kullanıyorum. Bu nesnelerin bir dizi üzerinde usort çalıştırdıktan sonra, ben nesnelerin bazı değerlerin dizideki konumlarını ile birlikte değişti olduğunu tespit ettik. Ne eksik? Benim kullanıcı karşılaştırma fonksiyonu herhangi bir yan etkisi vardır inanmıyorum. Usort deconstruct deconstruct / nesneleri nasıl bazı yeniden mi?
İşte kullanıyorum kullanıcı karşılaştırma işlevi:
private function SortArrayOfSegments($segments){
foreach($segments as $segment){
echo '<pre>';
var_dump($segment);
}
usort($segments, "AirObject::CompareSegments");
foreach($segments as $segment){
var_dump($segment);
echo '</pre>';
}
return $segments;
}
public static function CompareSegments($a, $b){
$interval = date_diff(date_create($a->StartDateTime->GetString()),
date_create($b->StartDateTime->GetString()));
if($interval->invert == 1){
return 1;
}else if($interval->y == 0 && $interval->m == 0 && $interval->d == 0
&& $interval->i == 0 && $interval->s == 0 && $interval->h == 0){
return 0;
}else if($interval->invert == 0){
return -1;
}
}
Ben böyle bakmak istimal nesneleri:
object(AirSegment)#14 (12) {
["StartDateTime"]=>
object(VDateTime)#27 (4) {
["date"]=>
string(10) "2010-12-07"
["time"]=>
string(8) "09:23:21"
["timezone"]=>
string(0) ""
["utc_offset"]=>
string(0) ""
}
["EndDateTime"]=>
object(VDateTime)#23 (4) {
["date"]=>
string(10) "2010-12-07"
["time"]=>
string(8) "13:23:21"
["timezone"]=>
string(0) ""
["utc_offset"]=>
string(0) ""
}
["start_airport_code"]=>
string(3) "SFO"
["start_city_name"]=>
string(13) "San Francisco"
["end_airport_code"]=>
string(3) "STL"
["end_city_name"]=>
string(8) "St Louis"
["operating_airline"]=>
string(15) "United Airlines"
["operating_flight_number"]=>
string(3) "335"
["duration"]=>
float(NAN)
["required_properties":protected]=>
array(9) {
["StartDateTime"]=>
bool(false)
["EndDateTime"]=>
bool(false)
["start_airport_code"]=>
bool(false)
["end_airport_code"]=>
bool(false)
["operating_airline"]=>
bool(false)
["operating_flight_number"]=>
bool(false)
["start_city_name"]=>
bool(false)
["end_city_name"]=>
bool(false)
["service_class"]=>
bool(true)
}
["service_class"]=>
string(5) "Coach"
["trip_id"]=>
string(4) "1621"
}
Değişiyor özelliği süresi özelliğidir. Usort çalıştırmadan önce, her nesnenin geçerli bir float değeri vardır. Usort sonra, bunlar iki NaN bulunmaktadır.
RESOLUTION:
date_diff yan etkileri vardır - en azından PHP benim build. Tamamen sorunlar giderildi kaldırılıyor.
public static function CompareSegments($a, $b){
$adate = new DateTime($a->StartDateTime->GetString());
$bdate = new DateTime($b->StartDateTime->GetString());
$lessThan = $adate < $bdate;
$equal = $adate == $bdate;
$greaterThan = $adate > $bdate;
if($lessThan){
return -1;
}else if($equal){
return 0;
}else{
return 1;
}
}