Как найти ближайшую дату из массива, чтобы вставить в уже выбранный массив дат

#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);