2016-10-10 2 views
1

Я ищу некоторые советы о том, что было бы лучшим способом найти ближайший startTime (рекомендуется startTime).Найти ближайшую дату/время в Array of Objects

То, что я получил до сих пор:

<?php 
$array = array( array("meeting_id" => "1812", 
         "startTime" => "2016-10-07 14:30:00", 
         "endTime" => "2016-10-07 14:35:00"), 
        array("meeting_id" => "1812", 
         "startTime" => "2016-10-07 14:35:00", 
         "endTime" => "2016-10-07 14:40:00"), 
        array("meeting_id" => "1812", 
         "startTime" => "2016-10-07 14:40:00", 
         "endTime" => "2016-10-07 14:45:00"), 
        array("meeting_id" => "1813", 
         "startTime" => "2016-10-07 15:05:00", 
         "endTime" => "2016-10-07 15:10:00"), 
        array("meeting_id" => "1813", 
         "startTime" => "2016-10-07 15:10:00", 
         "endTime" => "2016-10-07 15:15:00"), 
        array("meeting_id" => "1813", 
         "startTime" => "2016-10-07 15:20:00", 
         "endTime" => "2016-10-07 15:25:00"), 
    ); 

arsort($array); 
$firstTime = $array[0]; 
foreach($array as $key){ 
    if($firstTime["startTime"] > $key["endTime"]){ 
     // Do something in here. 
    } 
} 

print_r($array); 


?> 

Печатный Массив:

Array 
(
    [5] => Array 
     (
      [meeting_id] => 1813 
      [startTime] => 2016-10-07 15:20:00 
      [endTime] => 2016-10-07 15:25:00 
     ) 

    [4] => Array 
     (
      [meeting_id] => 1813 
      [startTime] => 2016-10-07 15:10:00 
      [endTime] => 2016-10-07 15:15:00 
     ) 

    [3] => Array 
     (
      [meeting_id] => 1813 
      [startTime] => 2016-10-07 15:05:00 
      [endTime] => 2016-10-07 15:10:00 
     ) 

    [2] => Array 
     (
      [meeting_id] => 1812 
      [startTime] => 2016-10-07 14:40:00 
      [endTime] => 2016-10-07 14:45:00 
     ) 

    [1] => Array 
     (
      [meeting_id] => 1812 
      [startTime] => 2016-10-07 14:35:00 
      [endTime] => 2016-10-07 14:40:00 
     ) 

    [0] => Array 
     (
      [meeting_id] => 1812 
      [startTime] => 2016-10-07 14:30:00 
      [endTime] => 2016-10-07 14:35:00 
     ) 

) 

Как и следовало ожидать, чтобы работать:

  • Найти самые ранние время начала для meeting_id == 1812, а затем найти ближайшая следующая встреча, чей ID! = 1812. Однако время начала встречи ID! = 1812 должно быть больше, чем выбранное время окончания 1812
+1

Вы можете сортировать с 'startTime' и взять первую строку. Для сортировки [sort-multi-dimension-array-by-specific-key] (http://stackoverflow.com/questions/4022289/sort-multi-dimensional-array-by-specific-key) –

+0

Вы пытались написать код самостоятельно? – Dekel

+0

@Dekel Да, я дам вам это. –

ответ

1

Следующая функция примет ваш массив в качестве первого аргумента, и совещание ID как второй, и в свою очередь, возвращает ближайшее заседание в первой встрече с идентификатором не $id:

function get_nearest_meeting($meetings, $id) 
{ 
    // Start by sorting the meetings: 
    function sorter($a, $b) 
    { 
     return strtotime($a['startTime']) - strtotime($b['startTime']); 
    } 
    usort($meetings, 'sorter'); 

    foreach($meetings as $meeting) 
    { 
     if($meeting['meeting_id'] == $id) 
     { 
      $earliest = strtotime($meeting['endTime']); 
      break; 
     } 
    } 

    // Now loop over again and get the next meeting: 
    foreach($meetings as $meeting) 
    { 
     if($meeting['meeting_id'] != $id && strtotime($meeting['startTime']) > $earliest) 
     { 
      return $meeting; 
     } 
    } 
} 

Учитывая следующие входные (хранящаяся в $meetings):

Array 
(
    [0] => Array 
     (
      [errors] => 0 
      [meeting_id] => 1812 
      [id] => 31305 
      [startTime] => 2016-10-07 14:00:00 
      [endTime] => 2016-10-07 14:10:00 
      [grade_id] => 87 
     ) 

    [1] => Array 
     (
      [errors] => 0 
      [meeting_id] => 1813 
      [id] => 31305 
      [startTime] => 2016-10-07 14:10:00 
      [endTime] => 2016-10-07 14:20:00 
      [grade_id] => 87 
     ) 

    [2] => Array 
     (
      [errors] => 0 
      [meeting_id] => 1812 
      [id] => 31305 
      [startTime] => 2016-10-07 14:10:00 
      [endTime] => 2016-10-07 14:20:00 
      [grade_id] => 87 
     ) 

    [3] => Array 
     (
      [errors] => 0 
      [meeting_id] => 1812 
      [id] => 31305 
      [startTime] => 2016-10-07 14:20:00 
      [endTime] => 2016-10-07 14:30:00 
      [grade_id] => 87 
     ) 

    [4] => Array 
     (
      [errors] => 0 
      [meeting_id] => 1813 
      [id] => 31305 
      [startTime] => 2016-10-07 14:20:00 
      [endTime] => 2016-10-07 14:30:00 
      [grade_id] => 87 
     ) 

    [5] => Array 
     (
      [errors] => 0 
      [meeting_id] => 1815 
      [id] => 31305 
      [startTime] => 2016-10-07 14:30:00 
      [endTime] => 2016-10-07 14:40:00 
      [grade_id] => 87 
     ) 

    [6] => Array 
     (
      [errors] => 0 
      [meeting_id] => 1812 
      [id] => 31305 
      [startTime] => 2016-10-07 14:30:00 
      [endTime] => 2016-10-07 14:40:00 
      [grade_id] => 87 
     ) 

    [7] => Array 
     (
      [errors] => 0 
      [meeting_id] => 1813 
      [id] => 31305 
      [startTime] => 2016-10-07 14:30:00 
      [endTime] => 2016-10-07 14:40:00 
      [grade_id] => 87 
     ) 

    [8] => Array 
     (
      [errors] => 0 
      [meeting_id] => 1815 
      [id] => 31305 
      [startTime] => 2016-10-07 14:40:00 
      [endTime] => 2016-10-07 14:50:00 
      [grade_id] => 87 
     ) 

    [9] => Array 
     (
      [errors] => 0 
      [meeting_id] => 1813 
      [id] => 31305 
      [startTime] => 2016-10-07 14:40:00 
      [endTime] => 2016-10-07 14:50:00 
      [grade_id] => 87 
     ) 

) 

И называть это так:

get_nearest_meeting($meetings, 1812); 

Мы заканчиваем со следующим результатом:

Array 
(
    [errors] => 0 
    [meeting_id] => 1813 
    [id] => 31305 
    [startTime] => 2016-10-07 14:10:00 
    [endTime] => 2016-10-07 14:20:00 
    [grade_id] => 87 
) 
+0

Привет, BenM - Спасибо за это. Однако может ли он работать немного по-другому, поэтому, когда передается «id», он проверяет самый ранний «startTime», затем проверяет остальное, чтобы найти самое близкое время начала, которое больше, чем «endTime» выбранного раннего времени на пройденном 'id'? –

+0

Итак, вы хотите найти самое раннее время начала 'meeting_id' ==' 1812', а затем найдите ближайшую * следующую встречу, чей идентификатор! = '1812'? – BenM

+0

Точно, что :) –