Функция поиска ближайших свободных мест
Разместите заказ на фриланс-бирже и предложения поступят уже через несколько минут.
PHP-функция для выбора оптимальной брони (заказа) работы подразделений организации распределённой на некоторой территории. Может использоваться например для бронирования времени для сети распределённых СТО или отелей и т. д.
FreeOrganization(40, 60.54, 30.40, 60.42, '2019-07-09 15:15:00', 10800);
function FreeOrganization($lat_min, $lat_max, $lon_min, $lon_max, $start_finding_tatetime, $time_len_sec)
{
$link=mysqli_connect("localhost","root","","time_location_org")
or die("Ошибка " . mysqli_error($link));
$result=mysqli_query($link, "SELECT organizations.org_id, organizations.name
FROM organizations JOIN locations ON organizations.org_id = locations.org_id
WHERE (locations.latitude>=$lat_min)AND(locations.latitude
(locations.longitude>=$lon_min)AND(locations.longitude
");
while ($RowORG = mysqli_fetch_assoc($result))
{
$id_org=$RowORG['org_id'];
$FreeTime=strtotime($start_finding_tatetime);
$FreeTime=Day_Org($link, $id_org, $FreeTime, $time_len_sec); // проверка корректности даты и интервала. Если дата не корректна выбирается другая как начало следующего дня
$result2=mysqli_query($link, "SELECT orders.date_start, orders.date_end, org_timework.day_num, org_timework.time_start, org_timework.time_end
FROM orders LEFT JOIN org_timework ON orders.org_id=org_timework.org_id
WHERE (orders.org_id=$id_org)AND
(orders.date_end>='$start_finding_tatetime')AND
(orders.status=1)AND
(org_timework.day_num=WEEKDAY(orders.date_start)+1)
ORDER BY orders.date_start
");
while ($RowOrders = mysqli_fetch_assoc($result2))
{
if (strtotime($RowOrders['date_start'])-$FreeTime
{
$FreeTime=strtotime($RowOrders['date_end']);
$Ts=strtotime($RowOrders['time_end']);
$Date_end=mktime(date("H",$Ts), date("i",$Ts), date("s",$Ts), date("n",$FreeTime), date("j",$FreeTime), date("Y",$FreeTime)); // сборка даты и времени окончания рабочего дня
if ($Date_end-$FreeTime
}
else break; // время найдено !!! (выход из цикла перебора брони, осуществляется когда интервал укладывается в промежуток до следующей брони
} // конец перебора брони
mysqli_free_result($result2);
echo '
'.$id_org.' -- '.$RowORG['name'].' -- '.date('Y.m.d H:i:s', $FreeTime).'
';$json_data=array($id_org, $FreeTime);
file_put_contents('Results/'.date('d-H-i-s', time()).'.json', json_encode($json_data), FILE_APPEND);
} // конец перебора организаций
return 1;
} // конец функции
function Day_Org($link1, $id_org, $DateR, $Interval) // проверка даты и поиск следующей рабочей даты-времени для организации
{
$result3=mysqli_query($link1, "SELECT day_num, time_start, time_end FROM org_timework WHERE org_id=$id_org ORDER BY day_num");
$TabelTime = array(0,6);
while ($row = mysqli_fetch_assoc($result3)) {
$i=$row['day_num'];
$TabelTime[$i] = $row;
}
$DayW=date('w', $DateR);
if (isset($TabelTime[$DayW]['day_num'])) {
$TimeStart=strtotime($TabelTime[$DayW]['time_start']);
$TimeEnd=strtotime($TabelTime[$DayW]['time_end']);
$DateTimeStart=mktime(date("H",$TimeStart), date("i",$TimeStart), date("s",$TimeStart), date("n",$DateR), date("j",$DateR), date("Y",$DateR));
$DateTimeEnd=mktime(date("H",$TimeEnd), date("i", $TimeEnd), date("s",$TimeEnd), date("n",$DateR), date("j",$DateR), date("Y",$DateR));
if (($DateR>=$DateTimeStart)AND($DateR
($DateR+$Interval>=$DateTimeStart)AND($DateR+$Interval
return $DateR;
}
//echo $TabelTime[$DayW]['day_num'];
if (($DateR=$Interval))// частный случай когда введено раннее время (до начала рабочего дня)
{
$NewDay=mktime(date("H",$TimeStart), date("i",$TimeStart), date("s",$TimeStart), date("m", $DateR), date("d", $DateR), date("Y", $DateR));
return $NewDay;
}
}
$NewDay=$DateR;
for ($i=0; $i
if ($DayW
$NewDay=mktime(0,0,0, date("m", $NewDay), date("d", $NewDay)+1, date("Y", $NewDay));
//echo '
'.$DayW.'
';if (isset($TabelTime[$DayW]['day_num'])) {
$TimeStart=strtotime($TabelTime[$DayW]['time_start']);
$TimeEnd=strtotime($TabelTime[$DayW]['time_end']);
$NewDay=mktime(date("H",$TimeStart), date("i",$TimeStart), date("s",$TimeStart), date("m", $NewDay), date("d", $NewDay), date("Y", $NewDay));
if ($TimeEnd-$TimeStart>=$Interval) return $NewDay;
}
} //конец цикла
return NULL;
}
?>