Вывод определенной даты из производственного календаря
Нужно определить дату доставки исходя из статусов товара и времени до и после 13:00 по Екатеринбургу. Взял за основу производственный календарь, который отдает json данные, посмотреть пример можно тут: https://production-calendar.ru/get/ru/2024/json UPD: код переработал, изначально был другим.
<div class="calendar">
<?php
// Новый код от 20.01.2024 даты доставки
$dateEkat = new DateTime("now", new DateTimeZone('Asia/Yekaterinburg'));
$date_now = $dateEkat->format('d.m.Y');
$hours = $dateEkat->format('H:m');
// проходимся по массиву с датами, формируем новый массив, где в качестве ключа даты будет выступать
// h - holiday, w - work
foreach ($calendar['days'] as $item) {
if ($item['type_id'] == 2 || $item['type_id'] == 3 || $item['type_id'] == 4 || $item['type_id'] == 6) {
$item['type_id'] = 'h';
$new_arr[][$item['type_id']] = $item['date'];
}elseif($item['type_id'] == 1 || $item['type_id'] == 5){
$item['type_id'] = 'w';
$new_arr[][$item['type_id']] = $item['date'];
}
}
// проходимся в цикле по новому массиву с целью отрезать предыдущие даты, которые уже прошли,
// с учетом выходных, праздничных и т.д...
// формируем новый массив, для того, чтобы потом подсчитать какое кол-во элементов мы отрезали
foreach($new_arr as $key => $val){
if($val['h'] == $date_now || $val['w'] == $date_now){
break;
}
$count_date[] = $key;
}
// проходимся в цикле по новому массиву чтобы сформировать новый массив со всеми датами
foreach($new_arr as $key => $val){
$all_date[] = $val;
}
// отсекаем от нового массива предыдущие даты, получаем массив, который начинается с сегодняшней даты
$res_work = array_slice($all_date, count($count_date)+1);
// и снова проходимся в цикле чтобы сформировать только рабочие дни
foreach($res_work as $key => $item){
foreach($item as $k => $v){
if($k == 'h'){
unset($k);
}
if($k == 'w'){
$date[] = $v;
}
}
}
// ну и собственно выводим дату по ключу, учитываем что ключ начинает отсчет с 0
if($p['is_order'] == 'Y' && $p['is_exist'] == 'Y' && $time[0]['time'] >= $hours){
echo '<p>Доставка с <strong>'.$date[11].'</strong> при оплате до '.$time[0]['time'].'</p>';
}elseif($p['is_order'] == 'Y' && $p['is_exist'] == 'Y' && $time[0]['time'] < $hours){
echo '<p>Доставка с <strong>'.$date[12].'</strong> при оплате до '.$time[0]['time'].'</p>';
}elseif($p['is_exist'] == 'Y' && $p['is_order'] == 'N' && $time[0]['time'] >= $hours){
echo '<p>Доставка с <strong>'.$date[0].'</strong> при оплате до '.$time[0]['time'].'</p>';
}elseif($p['is_exist'] == 'Y' && $p['is_order'] == 'N' && $time[0]['time'] < $hours){
echo '<p>Доставка с <strong>'.$date[1].'</strong> при оплате до '.$time[0]['time'].'</p>';
}
// Новый код от 20.01.2024 даты доставки
?>
</div>
Такс... вот этот код работает вроде, если кому не сложно, подкиньте идеи, может можно как-то по другому сделать?