$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")
);
答案 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);