#php #arrays #date
#php #массивы #Дата
Вопрос:
$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")
);
Комментарии:
1. Я считаю, что функция closestDate уже работает нормально …. Теперь, как вы хотите использовать $ alreadyChosen??? для меня это непонятно в вашем вопросе
2. что вы подразумеваете под
doesn't check on duration time
. Также в вашем вопросе упоминаются два$alreadyChosen
3. не могли бы вы подробнее рассказать о своем ожидаемом результате.. Я не могу ее получить
4. @undefined_variable Ожидаемый результат — иметь возможность передавать начальную дату, которая была бы
2016-02-18 02:00:00
длительностью 600 (10 минут) в зависимости от продолжительности, найдите ближайшую дату, которая была бы равна концу продолжительности или больше продолжительности. Затем так далее…..5. @undefined_variable Я обновил свой вопрос, теперь его должно быть легче понять.
Ответ №1:
Если вы хотите получить наиболее близкую дату к дате, которую вы вводите в функцию, и предотвратить даты, которые уже выбраны, вы могли бы сделать это так:
function pickMostCloserDate($dateArray, $compareDate, amp;$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];
}
Это вернет самую близкую дату и добавит найденную дату в выбранные даты, так что на самом деле вам нужно сделать это:
$pickedDates = [];
$closeDate = pickMostCloserDate($arrayWithDates, '2016-05-05 00:00:00', $pickedDates);
echo $CloseDate;
// следующий раунд для выбора даты
Надеюсь, это поможет. Пожалуйста, имейте в виду, что я написал это из head, нужно исправить.
Комментарии:
1. Привет, я обновил свой вопрос дополнительной информацией, это должно помочь вам с тем, что я ищу.
2. Я еще больше обновил свой ответ, теперь его должно быть легче понять.
3. Привет, Крис, это должно помочь вам с вашей проблемой. Функция выберет ближе к определенной дате, а также добавит найденную дату в переменную pickedDates. По мере того, как вы будете вызывать функцию, будут выбираться новые даты.
4. Привет, Камил. Ваш ответ пока дает мне именно то, что я уже получил в своем вопросе. Пожалуйста, проверьте мой ожидаемый результат, чтобы дать себе представление о том, что я ищу.
5. Крис, я не уверен, понимаю ли я, чего ты хочешь. Но, как я вижу, во втором массиве больше дат. Что на самом деле делает эта функция, если вы будете вызывать функцию несколько раз. Он добавит даты в переменную $pickedDates. Таким образом, в этом случае вы, вероятно, могли бы поместить эту функцию в цикл, чтобы сохранить эти даты в этой переменной. Это то, что я понял, чего вы хотели.
Ответ №2:
Я нашел решение, выполнив следующее: (я многое изменил в своем вопросе, чтобы заставить его работать)
$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'] amp;amp; $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 amp;amp; $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);