在Array of Objects中查找最接近的日期/时间

问题描述:

我正在寻找一些建议,以寻找最接近的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-dimensional-array-by-specific-key](http://stackoverflow.com/questions/4022289/sort-multi-dimensional-array-by-specific-key) –

+0

你试过自己写一些代码? – Dekel

+0

@Dekel是的,我现在就为你提供。 –

以下函数将把您的数组作为第一个参数,和会议ID作为第二,和将依次返回最近的会议的会议最早其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'的最早开始时间,然后找到ID!='1812'最接近的* next *会议? – BenM

+0

确切地说:) –