#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");
$pickedDates = [];
function findMeetingAlreadyExistsInArray($array, $dateTime){
foreach($array as $item){
if ($item["date"] === $dateTime) return true;
}
}
function closestDate($dateArray, $compareDate, amp;$pickedDates = array()){
$dates = [];
foreach($dateArray as $key => $originalDate){
$date = $originalDate['date'];
if(!findMeetingAlreadyExistsInArray($pickedDates, $date)){
if(abs(strtotime($compareDate["date"]) - strtotime($date)) >= $compareDate["duration"]){
$dates[$key] = abs(strtotime($compareDate["date"]) - strtotime($date));
}
}
}
asort($dates);
$dateIndex = array_shift(array_keys($dates));
array_push($pickedDates, $dateArray[$dateIndex]);
return $dateArray[$dateIndex];
}
foreach($dates as $item) closestDate($dates, $item, $pickedDates);
print_r($pickedDates);
Результат из приведенной выше функции:
Array
(
[0] => Array
(
[date] => 2016-02-18 02:10:00
[duration] => 600
)
[1] => Array
(
[date] => 2016-02-18 02:00: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
)
[4] => Array
(
[date] => 2016-02-18 02:05:00
[duration] => 300
)
)
Ожидаемый результат:
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:
Вот моя попытка… Я немного изменился, просто чтобы понять, что именно вы пытаетесь сделать.
$dates[] = array("date" => "2016-02-18 02:00:00", "duration" => "600"); // 10 mins
$dates[] = array("date" => "2016-02-18 02:05:00", "duration" => "300"); // 5 mins
$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");
$pickedDates = [];
function dateExists(array $array, $date) {
if (empty($array)) {
return false;
}
$flag = false;
foreach($array as $value) {
// exact match
if ($value['date'] == $date) {
return true;
}
// range match
$start = strtotime($value['date']);
$end = $start $value['duration'];
$ts = strtotime($date);
if ($ts > $start amp;amp; $ts < $end) {
$flag = true;
break;
}
}
return $flag;
}
foreach ($dates as $key => $date) {
if (!dateExists($pickedDates, $date['date'])) {
$pickedDates[$key] = $date;
}
}
echo '<pre>';
var_dump($pickedDates);
echo '</pre>';
Это дает желаемые результаты:
array(4) {
[0]=>
array(2) {
["date"]=>
string(19) "2016-02-18 02:00:00"
["duration"]=>
string(3) "600"
}
[2]=>
array(2) {
["date"]=>
string(19) "2016-02-18 02:10:00"
["duration"]=>
string(3) "600"
}
[3]=>
array(2) {
["date"]=>
string(19) "2016-02-18 02:25:00"
["duration"]=>
string(3) "300"
}
[4]=>
array(2) {
["date"]=>
string(19) "2016-02-18 02:30:00"
["duration"]=>
string(3) "600"
}
}
Не уверен, должна ли ваша closestDate
функция существовать и с этими точными параметрами. В любом случае, вы должны иметь возможность изменить это в соответствии с вашими требованиями.
Комментарии:
1. Это именно то, что мне было нужно. Вы спасаете жизнь! 🙂
2. Пожалуйста, проверьте это 3v4l.org/62dAS и посмотрите на комментарий после «ПОЖАЛУЙСТА, ПРОВЕРЬТЕ ЭТОТ БИТ» и скажите мне, можно ли это адаптировать к вашей функции?
3. @ChrisBeckett это может быть адаптировано с небольшими изменениями. было бы полезно узнать, как вы планируете это использовать.
4. Привет, мистер Мартин, извините за задержку с ответом на ваш звонок. Проверьте следующую ссылку — 3v4l.org/g3HEg Я обновил пример в разделе «ПОЖАЛУЙСТА, ПРОВЕРЬТЕ ЭТОТ БИТ», чтобы попытаться дать вам больше представления о том, какая информация мне нужна. Это будет действовать как рекомендация для бронирования слотов. Будет родитель с несколькими дочерними элементами, и это в основном для получения наилучшего рекомендуемого времени, начиная с того, какой слот они хотят забронировать для своего первого дочернего элемента. Вот почему у меня есть ключ в качестве времени начала первого слота.
5. Поскольку я ищу наименьшую продолжительность от первого до последнего слота в выбранных датах, чтобы она была наименьшей. Так что родительский сервер не будет долго ждать. Однако эти времена будут просто рекомендациями, им не придется принимать рекомендуемые времена, если они не хотят.