Php 按对象中的日期对对象数组进行排序

Php 按对象中的日期对对象数组进行排序,php,arrays,sorting,google-calendar-api,google-api-php-client,Php,Arrays,Sorting,Google Calendar Api,Google Api Php Client,我正在尝试使用来自Google Calendar批处理请求的对象对该数组进行排序,结果是使用对象对该数组进行排序: array(3) { ["response-test0"]=>; object(Google_Service_Calendar_Events)#46 (17) { . . . ["items"]=>; array(1) { [0]=>; array(20

我正在尝试使用来自Google Calendar批处理请求的对象对该数组进行排序,结果是使用对象对该数组进行排序:

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();
我曾尝试使用这个片段(以及其他许多片段)按日期([“开始”])-日历会议的开始对各个项目进行排序,但迄今为止运气不佳。我也考虑过合并对象,但运气不好。我是一名PHP新手,但相当了解og编程的基础知识,因此我希望有人能为我指明正确的方向-我将非常感谢:

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');
我使用时间戳,这样您就不需要将日期格式化为字符串

资料来源:

针对您关于通过删除第一层来重新排列阵列的评论,您可以尝试以下方法。请注意,要知道哪个记录是哪个记录,键可能很重要

$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的建议),循环遍历Calendar API生成的数组。对于其他可能有同样问题的人,我在这里发布相关部分。我确信我的代码可以在语义上得到优化和更好的外观,但它可以工作:

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');
函数cmpDate($a,$b){
$date1=新的日期时间($a['start']);
$date2=新的日期时间($b['start']);
$date1=$date1->getTimestamp();
$date2=$date2->getTimestamp();
返回$date1-$date2;
}
$y=0;
对于($x=0;$x getItems())==0){
}否则{
foreach($results[“response test”。$x.“”]->getItems()作为$event){
$start=$event->start->dateTime;
$dato=日期格式(日期创建($start),“d.m.Y”);
$s=strottime($start);
if(空($start)){
$start=$event->start->date;
}
$tid=新日期时间($start);
$data[$y]['start']=$start;
$data[$y]['dato']=$dato;
$data[$y]['tid']=$tid->format('H:i');
$data[$y]['lokasjon']=$event->getLocation();
$data[$y]['Organizator']=$event->getOrganizer()->电子邮件;
$data[$y]['tema']=$event->getSummary();
$y++;
}
}
usort($data,'cmpDate');

请尝试使用
strotime($a['items']['start'])-strotime($b['items']['start'])
或更好地创建
DateTime对象
,然后在
usort
中细分您的值,因为我不需要[“response testx”]级别-是否有方法合并或展平数组-将所有记录向上移动一步,并消除错误['response-testx']level?@petrusjak如果您想减小阵列大小,我更新了答案。您也可以帮助我将正确的“路径”设置为['start']?如果$a['items]['start'],则不包括舒尔是正确的-我想我遗漏了一些东西。@petrusjak我已经更新了代码。你很接近了。$a是一个对象,应该被引用为->。抱歉-我在:$date1=new\DateTime($a->items[0]['start']['DateTime']->getTimeStamp();$date2=new\DateTime($b->items[0]['start'['DateTime']]->getTimeStamp()上出现语法错误;PHP解析错误:语法错误,C:\inetpub\gadgetsite\infotavle.PHP第62行出现意外的'->'(T_OBJECT_运算符)。您能否在cmpDate中发布$a和$b的输出。请参阅更新的答案。我删除了abs()。不需要它。
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');