如何从数组中找到最接近的日期以推入已选择的日期数组

时间:2016-10-19 09:26:15

标签: php arrays date

$dates[] = array("date" => "2016-02-18 02:00:00", "duration" => "600");
$dates[] = array("date" => "2016-02-18 02:05:00", "duration" => "300");
$dates[] = array("date" => "2016-02-18 02:10:00", "duration" => "600");
$dates[] = array("date" => "2016-02-18 02:25:00", "duration" => "300");
$dates[] = array("date" => "2016-02-18 02:30:00", "duration" => "600");
function closestDates($array, $date){   
    foreach($array as $day)
         $interval[] = abs(strtotime($date["date"]) - strtotime($day["date"]));
    asort($interval);
    $closest = key($interval);
    $alreadyChosen[] = $array[$closest];
    return $alreadyChosen;
}
$returnedDates = closestDates($dates, array("date" => "2016-02-18 02:00:00", "duration" => "600"));
print_r($returnedDates);

// This returns 
Array ( 
    [0] => Array ( 
        [date] => 2016-02-18 02:00:00 
        [duration] => 600 
    ) 
)

如何调整上述功能,以便能够检查dates数组,并根据持续时间将下一个最近的日期推送到alreadyChosen数组。

$dates = (
    '0'=> array("date" => "2016-02-18 02:00:00", "duration" => "600"),
    '1'=> array("date" => "2016-02-18 02:05:00", "duration" => "300"),
    '2'=> array("date" => "2016-02-18 02:10:00", "duration" => "600"),
    '3'=> array("date" => "2016-02-18 02:25:00", "duration" => "300"),
    '4'=> array("date" => "2016-02-18 02:30:00", "duration" => "600")
);

// Expected result to be after the checks:
$alreadyChosen = array
(
    '0'=> array("date" => "2016-02-18 02:00:00", "duration" => "600"),
    '1'=> array("date" => "2016-02-18 02:10:00", "duration" => "600"),
    '2'=> array("date" => "2016-02-18 02:25:00", "duration" => "300"),
    '3'=> array("date" => "2016-02-18 02:30:00", "duration" => "600")
);

2 个答案:

答案 0 :(得分:1)

如果你想获得最接近日期的日期,你输入的功能和预防已经选择的日期你可以这样做:

function pickMostCloserDate($dateArray, $compareDate, &$pickedDates = array())
{
    $dates = [];  
    foreach($dateArray as $key => $originalDate){
        $date = $date['date'];
        //compare options
        if(!in_array($originalDate, $pickedDates)){
           $dates[$key] = abs(strtotime($compareDate) - strtotime($date));
        }
    }

    asort($dates);

    $dateIndex = array_shift(array_keys($dates));

    array_push($pickedDates, $dateArray[$dateIndex]);
    return $dateArray[$dateIndex];

}

这将返回最接近的日期,它会将已发现的日期添加到pickDates,所以您必须做的是:

$pickedDates = [];
$closeDate = pickMostCloserDate($arrayWithDates, '2016-05-05 00:00:00', $pickedDates);

echo $ closeDate;

//下一轮选择日期

希望这会有所帮助。请注意,我是从头开始编写的,需要修复。

答案 1 :(得分:0)

我通过以下方式找到了解决方案:(我从我的问题中改变了很多东西以使其正常工作)

$dates[] = array("date" => "2016-02-18 02:00:00", "meeting_id" => "1", "class_id" => "10", "duration" => "600");
$dates[] = array("date" => "2016-02-18 02:10:00", "meeting_id" => "1", "class_id" => "10", "duration" => "600");
$dates[] = array("date" => "2016-02-18 02:20:00", "meeting_id" => "1", "class_id" => "10", "duration" => "600");
$dates[] = array("date" => "2016-02-18 02:30:00", "meeting_id" => "1", "class_id" => "10", "duration" => "600");
$dates[] = array("date" => "2016-02-18 02:10:00", "meeting_id" => "2", "class_id" => "10", "duration" => "600");
$dates[] = array("date" => "2016-02-18 02:25:00", "meeting_id" => "2", "class_id" => "10", "duration" => "300");
$dates[] = array("date" => "2016-02-18 02:30:00", "meeting_id" => "3", "class_id" => "10", "duration" => "600");
$dates[] = array("date" => "2016-02-18 02:40:00", "meeting_id" => "3", "class_id" => "10", "duration" => "600");
$dates[] = array("date" => "2016-02-18 02:30:00", "meeting_id" => "4", "class_id" => "11", "duration" => "600");
$dates[] = array("date" => "2016-02-18 02:40:00", "meeting_id" => "4", "class_id" => "11", "duration" => "600");
$dates[] = array("date" => "2016-02-18 02:50:00", "meeting_id" => "4", "class_id" => "11", "duration" => "600");
$dates[] = array("date" => "2016-02-18 03:00:00", "meeting_id" => "4", "class_id" => "11", "duration" => "600");

$firstDates[] = array("date" => "2016-02-18 02:00:00", "meeting_id" => "1", "class_id" => "10", "duration" => "600");
$firstDates[] = array("date" => "2016-02-18 02:10:00", "meeting_id" => "1", "class_id" => "10", "duration" => "600");
$firstDates[] = array("date" => "2016-02-18 02:20:00", "meeting_id" => "1", "class_id" => "10", "duration" => "600");
$firstDates[] = array("date" => "2016-02-18 02:30:00", "meeting_id" => "1", "class_id" => "10", "duration" => "600");

$children[] = array("id" => 1, "class_id" => "10", "fullname" => "Callum");
$children[] = array("id" => 2, "class_id" => "10", "fullname" => "Daniel");
$children[] = array("id" => 3, "class_id" => "11", "fullname" => "Jake");

function dateExists($array, $child, $date) {
    if (empty($array)) {
        return false;
    }
    $flag = false;
    foreach($array as $value) {
        if ($value['child']['id'] == $child['id'] && $value['meeting']['meeting_id'] === $date['meeting_id']){
            return true;
        }
        if ($value['meeting']['date'] == $date['date']) {
            return true;
        }
        $start = strtotime($value['meeting']['date']);
        $end = $start + $value['meeting']['duration'];
        $ts = strtotime($date['date']);
        if ($ts > $start && $ts < $end) {
            $flag = true;
            break;
        }
    }
    return $flag;
}


$results = [];

function buildDates($dates, $children, $key, $firstDate) {
    $temp = [];
    $pickedDates = array();
    foreach ($children as $child) {
        if($firstDate["class_id"] === $child["class_id"]) {
            $temp[] = array('child' => $child, 'meeting' => $firstDate);
            $pickedDates[$firstDate['date']] = $temp;
        }
        break;
    }
    foreach ($dates as $key => $date) {
        foreach ($children as $child) {
            if($date["class_id"] === $child["class_id"]) {
                if (!dateExists($temp, $child, $date)) {
                    $temp[] = array('child' => $child, 'meeting' => $date);
                    $pickedDates[$firstDate['date']] = $temp;
                }
            }
        }
    }
    return $pickedDates = array($firstDate["date"] => $temp);
}

foreach ($firstDates as $date) {
    $results[] = buildDates($dates, $children, $date);
}

print_r($results);