按 object 中的日期对 object 的数组进行排序
Sorting array of objects by date in object
我正在尝试使用 Objects 对这个数组进行排序,该数组源自 Google 日历批处理请求,结果数组为 objects:
array(3) {
["response-test0"]=>;
object(Google_Service_Calendar_Events)#46 (17) {
.
.
.
["items"]=>;
array(1) {
[0]=>;
array(20) {
.
.
["start"]=>;
array(1) {
["dateTime"]=>;
string(25) "2017-02-01T10:00:00+01:00"
}
.
.
.
["response-test1"]=>;
object(Google_Service_Calendar_Events)#46 (17) {
.
.
.
["items"]=>;
array(1) {
[0]=>;
array(20) {
.
.
["start"]=>;
array(1) {
["dateTime"]=>;
string(25) "2017-02-01T11:00:00+01:00"
}
.
.
.
["response-test3"]=>;
object(Google_Service_Calendar_Events)#46 (17) {
.
.
.
["items"]=>;
array(1) {
[0]=>;
array(20) {
.
.
["start"]=>;
array(1) {
["dateTime"]=>;
string(25) "2017-02-01T11:00:00+01:00"
}
.
.
这是获取数据的代码:
$arrlength = count($calendarId);
for ($x = 0; $x <= $arrlength-1; $x++) {
$results = $service->events->listEvents($calendarId[$x], $optParams);
$batch->add($results, "test" .$x);
};
$results = $batch->execute();
生成的数组包含您(在本例中)object 个名为 ["response-test0"]、["response-test1"] 和 ["response-test2"] 如我的数组示例所示。
编辑:据我所知(或者我错了),数组 objects 与关联数组交织在一起的事实似乎在答案中缺失?内部搜索的建议object 似乎是在正确的方向上,但我无法完全测试它,因为 "top level" ['response_x'] 没有被考虑在内。
排序 start-dates 的结构(不是单独排序每个 object 中的日期):
array(3) {
["response-test0"]
Object(Google_Service_Calendar_Events)#46(17){
.
.
}
["response-test1"]
Object(Google_Service_Calendar_Events)#46(17){
.
.
}
["response-test2"]
Object(Google_Service_Calendar_Events)#46(17){
.
.
}
我曾尝试使用此代码段(以及许多其他代码段)按日期对各个项目进行排序 (["start"]) - 日历会议开始,但到目前为止运气不佳。我也考虑过合并 object,但没有成功。我是 PHP 的新手,但相当了解编程的基础知识,所以我希望有人能指出我正确的方向 - 我将不胜感激:
usort($results, function($a, $b) {
return $a['items']['start'] - $b['items']['start'];
});
var_dump( $results );
您可以使用 DateTime 对象来比较日期:
function cmpDate($a, $b) {
// To confirm expected result, dump the data for inspection.
//var_dump($a);
//var_dump($b);
// Option 1:
//$date1 = new \DateTime($a['items'][0]['start']['dateTime'])->getTimestamp();
//$date2 = new \DateTime($b['items'][0]['start']['dateTime'])->getTimestamp();
// Option 2
$date1 = new \DateTime($a->items[0]['start']['dateTime'])->getTimestamp();
$date2 = new \DateTime($b->items[0]['start']['dateTime'])->getTimestamp();
// usort compares integers and orders it accordingly.
return $date1 - $date2;
}
usort($results, 'cmpDate');
我正在使用时间戳,这样您就不需要将日期格式化为字符串。
来源:
http://php.net/manual/en/class.datetime.php
http://php.net/manual/en/function.usort.php
针对您关于通过删除第一层重新排列数组的评论,您可以尝试以下操作。请注意,键对于了解哪条记录是很重要的。
$newArr = [];
foreach ($results as $key => $data) {
// echo $key; // response-test0
// You can reduce the array as much as you like.
// $newArr[] = $data;
// $newArr[] = $data->items['start'];
$newArr[] = $data->items['start']['dateTime'];
// In case you want to preserve the key
// $newArr[$key] = $data->items['start']['dateTime'];
}
我通过构造一个更易于管理的数组进行排序(接近 Nitin 的建议)循环遍历来自日历 API 的结果数组,我自己找到了一个可行的解决方案。对于可能有同样问题的其他人,我 post 相关部分在这里。我确信我的代码可以得到优化并且在语义上看起来更好,但它有效:
function cmpDate($a, $b) {
$date1 = new DateTime($a['start']);
$date2 = new DateTime($b['start']);
$date1 = $date1->getTimestamp();
$date2 = $date2->getTimestamp();
return $date1 - $date2;
}
$y = 0;
for ($x = 0; $x <= $arrlength-1; $x++) {
if (count($results["response-test".$x.""]->getItems()) == 0) {
} else {
foreach ($results["response-test".$x.""]->getItems() as $event) {
$start = $event->start->dateTime;
$dato = date_format(date_create($start), "d.m.Y");
$s = strtotime($start);
if (empty($start)) {
$start = $event->start->date;
}
$tid = new dateTime($start);
$data[$y]['start'] = $start;
$data[$y]['dato'] = $dato;
$data[$y]['tid'] = $tid->format('H:i');
$data[$y]['lokasjon'] = $event->getLocation();
$data[$y]['organisator'] = $event->getOrganizer()->email;
$data[$y]['tema'] = $event->getSummary();
$y++;
}
}
usort($data, 'cmpDate');
我正在尝试使用 Objects 对这个数组进行排序,该数组源自 Google 日历批处理请求,结果数组为 objects:
array(3) {
["response-test0"]=>;
object(Google_Service_Calendar_Events)#46 (17) {
.
.
.
["items"]=>;
array(1) {
[0]=>;
array(20) {
.
.
["start"]=>;
array(1) {
["dateTime"]=>;
string(25) "2017-02-01T10:00:00+01:00"
}
.
.
.
["response-test1"]=>;
object(Google_Service_Calendar_Events)#46 (17) {
.
.
.
["items"]=>;
array(1) {
[0]=>;
array(20) {
.
.
["start"]=>;
array(1) {
["dateTime"]=>;
string(25) "2017-02-01T11:00:00+01:00"
}
.
.
.
["response-test3"]=>;
object(Google_Service_Calendar_Events)#46 (17) {
.
.
.
["items"]=>;
array(1) {
[0]=>;
array(20) {
.
.
["start"]=>;
array(1) {
["dateTime"]=>;
string(25) "2017-02-01T11:00:00+01:00"
}
.
.
这是获取数据的代码:
$arrlength = count($calendarId);
for ($x = 0; $x <= $arrlength-1; $x++) {
$results = $service->events->listEvents($calendarId[$x], $optParams);
$batch->add($results, "test" .$x);
};
$results = $batch->execute();
生成的数组包含您(在本例中)object 个名为 ["response-test0"]、["response-test1"] 和 ["response-test2"] 如我的数组示例所示。
编辑:据我所知(或者我错了),数组 objects 与关联数组交织在一起的事实似乎在答案中缺失?内部搜索的建议object 似乎是在正确的方向上,但我无法完全测试它,因为 "top level" ['response_x'] 没有被考虑在内。
排序 start-dates 的结构(不是单独排序每个 object 中的日期):
array(3) {
["response-test0"]
Object(Google_Service_Calendar_Events)#46(17){
.
.
}
["response-test1"]
Object(Google_Service_Calendar_Events)#46(17){
.
.
}
["response-test2"]
Object(Google_Service_Calendar_Events)#46(17){
.
.
}
我曾尝试使用此代码段(以及许多其他代码段)按日期对各个项目进行排序 (["start"]) - 日历会议开始,但到目前为止运气不佳。我也考虑过合并 object,但没有成功。我是 PHP 的新手,但相当了解编程的基础知识,所以我希望有人能指出我正确的方向 - 我将不胜感激:
usort($results, function($a, $b) {
return $a['items']['start'] - $b['items']['start'];
});
var_dump( $results );
您可以使用 DateTime 对象来比较日期:
function cmpDate($a, $b) {
// To confirm expected result, dump the data for inspection.
//var_dump($a);
//var_dump($b);
// Option 1:
//$date1 = new \DateTime($a['items'][0]['start']['dateTime'])->getTimestamp();
//$date2 = new \DateTime($b['items'][0]['start']['dateTime'])->getTimestamp();
// Option 2
$date1 = new \DateTime($a->items[0]['start']['dateTime'])->getTimestamp();
$date2 = new \DateTime($b->items[0]['start']['dateTime'])->getTimestamp();
// usort compares integers and orders it accordingly.
return $date1 - $date2;
}
usort($results, 'cmpDate');
我正在使用时间戳,这样您就不需要将日期格式化为字符串。
来源:
http://php.net/manual/en/class.datetime.php
http://php.net/manual/en/function.usort.php
针对您关于通过删除第一层重新排列数组的评论,您可以尝试以下操作。请注意,键对于了解哪条记录是很重要的。
$newArr = [];
foreach ($results as $key => $data) {
// echo $key; // response-test0
// You can reduce the array as much as you like.
// $newArr[] = $data;
// $newArr[] = $data->items['start'];
$newArr[] = $data->items['start']['dateTime'];
// In case you want to preserve the key
// $newArr[$key] = $data->items['start']['dateTime'];
}
我通过构造一个更易于管理的数组进行排序(接近 Nitin 的建议)循环遍历来自日历 API 的结果数组,我自己找到了一个可行的解决方案。对于可能有同样问题的其他人,我 post 相关部分在这里。我确信我的代码可以得到优化并且在语义上看起来更好,但它有效:
function cmpDate($a, $b) {
$date1 = new DateTime($a['start']);
$date2 = new DateTime($b['start']);
$date1 = $date1->getTimestamp();
$date2 = $date2->getTimestamp();
return $date1 - $date2;
}
$y = 0;
for ($x = 0; $x <= $arrlength-1; $x++) {
if (count($results["response-test".$x.""]->getItems()) == 0) {
} else {
foreach ($results["response-test".$x.""]->getItems() as $event) {
$start = $event->start->dateTime;
$dato = date_format(date_create($start), "d.m.Y");
$s = strtotime($start);
if (empty($start)) {
$start = $event->start->date;
}
$tid = new dateTime($start);
$data[$y]['start'] = $start;
$data[$y]['dato'] = $dato;
$data[$y]['tid'] = $tid->format('H:i');
$data[$y]['lokasjon'] = $event->getLocation();
$data[$y]['organisator'] = $event->getOrganizer()->email;
$data[$y]['tema'] = $event->getSummary();
$y++;
}
}
usort($data, 'cmpDate');