2017-02-01 6 views
2

I'am пытается разобраться в этом массиве с объектами, которые берут свое начало из по запросу Календаря Batch Google с этим в результате массива с объектами:Сортировка массива объектов по дате в объекте

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(); 

Полученный массив содержит тебя (в данном случае) объекты, названные [ "ответ-test0"], [ "ответ-test1"] и [ "ответ-test2"], как показано в моем массив.

Редактировать: факт, что объекты массива свернуты с помощью ассоциативного массива, кажется, отсутствуют в ответах, насколько я понимаю (или я ошибаюсь)? Предложения по поиску внутри объекта, похоже, находятся в в правильном направлении, но я не смог полностью проверить это, потому что «верхний уровень» ['response_x'] не учитывается.

Структуры сортировать старт-дату в (не индивидуально сортировочных датах в каждом объекте):

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 "]) - начало календарного собрания, но пока не повезло. Я также рассмотрел слияние объектов, но не повезло. Я новичок в PHP, но знаю основы О.Г. программирования достаточно, так что я надеюсь, что кто-то может мне точку в правильном направлении - и я был бы признателен:

usort($results, function($a, $b) { 
    return $a['items']['start'] - $b['items']['start']; 
}); 

var_dump($results); 
+0

Пожалуйста, попробуйте 'StrToTime ($ A [ 'элементы'] [ 'начать']) - StrToTime ($ B [» items '] [' start ']) 'или лучше создать объект DateTime, а затем добавить свои значения в' usort' – pleinx

+0

Поскольку мне не нужен уровень ["response-testx"] - есть способ слияния или сгладить массив - переместить все записи на один шаг вверх и избавиться от уровня ['response-testx']? – petrusjak

+0

@petrusjak i обновил ответ, если вы хотите уменьшить размер массива. – Nitin

ответ

0

я нашел рабочий раствор, сам обернув через полученный массив из календаря API, построив более manageble массив для сортировки (близко к предложению Нитин в). Для других, у кого может быть такая же проблема, я размещаю соответствующую часть здесь. Я уверен, что мой код может быть оптимизирован и лучше выглядит sematically, но это работает:

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'); 
2

Вы можете использовать объекты 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']; 

} 
+0

Можете ли вы также помочь мне с кортетом «путь» до ['start']? Не shure, если $ a ["items"] ['start'] верен - я думаю, что что-то не хватает. – petrusjak

+0

@petrusjak Я обновил код. Вы близки. $ a - объект, на который нужно ссылаться как ->. – Nitin

+0

Извините - я получаю синтаксическую ошибку: $ date1 = new \ DateTime ($ a-> items [0] ['start'] ['dateTime']) -> getTimeStamp(); $ date2 = new \ DateTime ($ b-> items [0] ['start'] ['dateTime']) -> getTimeStamp(); – petrusjak