#php #mysql #date #calendar
#php #mysql #Дата #Календарь
Вопрос:
Я работаю над календарем для своего офиса. У каждого человека есть своя колонка, и на каждый день есть строка.
Есть некоторые периодические даты, когда, например, данные люди должны работать в выходные дни. Но большинство дат поступают из базы данных MySQL.
Таким образом, он выполняет двойной цикл (люди против дат), в котором каждая дата должна быть проверена для человека, какое занятие он имеет в этот день.
Есть ли способ оптимизировать этот скрипт, потому что в Интернете это занимает не менее 2-3 секунд (всего 0,03 секунды в соответствии с PHP, но я не чувствую, что это правильно) и более 8 секунд (опять же в соответствии с PHP) в нашей сети! И это только на 5 месяцев, мы хотели бы иметь это на весь год.
Вы можете найти тестовую версию здесь (просто чтобы увидеть HTML и CSS): http://mybees.ch/for/tableau.php
И вот PHP в нем:
//Creating the line for the collaborators
$ids;
$ma_count=0;
$ma_name_query = mysqli_query($bdi,"SELECT DISTINCT m.id, m.name, m.vorname, m.grup FROM ma m, ma_pos mp WHERE m.id = mp.maid AND m.grup != 14 ORDER BY m.grup, mp.posid, m.name, m.vorname");
while($ma_name = mysqli_fetch_assoc($ma_name_query)) {
echo '<div class="cell name">'.$ma_name['name'].' '.$ma_name['vorname'].'</div>';
$ids[$ma_count] = $ma_name['id'];
$grup[$ma_count] = $ma_name['grup'];
$ma_count ;
}
// Check if special group day
$firstGroup = 1;
$firstDate = strtotime("$year-01-01 00:00 GMT");
$picket = array();
if (date("N", $firstDate) == 2)// Tuesday
$firstDate -= 24 * 3600;
elseif (date("N", $firstDate) == 3)// Wednesday
$firstDate -= 2 * 24 * 3600;
elseif (date("N", $firstDate) == 5)// Friday
$firstDate -= 24 * 3600;
elseif (date("N", $firstDate) == 6)// Saturday
$firstDate -= 2 * 24 * 3600;
elseif (date("N", $firstDate) == 7)// Sunday
$firstDate -= 3 * 24 * 3600;
for ($date = $firstDate; $date <= strtotime("$year-12-31 00:00 GMT"); $date = 24 * 3600) {
$weekNb = date("W",$date);
$weekDay = date("N",$date); // Monday = 1, Sunday = 7
if ($weekDay < 4)
$group = $weekNb % 4 - 1 $firstGroup;
else
$group = $weekNb % 4 - 2 $firstGroup;
if ($group == 0)
$group = 4;
if ($group == -1)
$group = 3;
$picket[$date] = $group;
}
$groupColor = ["yellow", "blue", "red", "green"];
function isPicket($date, $grup) {
global $picket, $groupColor;
//global $picket, $groupColor;
if ($grup < 5) {
if ($picket[$date] == $grup)
return " style='background-color: ".$groupColor[$picket[$date]-1]."'";
}
}
$today_stp = time() - time() % (24 * 3600) - 11 * 24 * 3600;
$frei_query_text = "SELECT id_ma, date1, date2, free.id as type, moment, remark, location FROM frei, free WHERE free.id = frei.type AND date1 BETWEEN CAST('$date1' AS DATE) AND CAST('$date2' AS DATE)";
$frei_query = mysqli_query($bdi, $frei_query_text);
$free = array();
while($frei = mysqli_fetch_assoc($frei_query)) {
$free[] = $frei;
}
// Filling the lines
for ($date = strtotime($date1); $date <= strtotime($date2); $date = 24 * 3600) {
$today = ($date == $today_stp) ? ' id="today"':'';
echo "<div class='clear'$today>";
$class = (date('N', $date) < 6) ? 'week' : 'weekend';
echo "<div class='date $class line'>".date("D, d.m.", $date)."</div>";
for ($i = 0; $i < $ma_count; $i ) {
echo "<div class='cell line $class'".isPicket($date,$grup[$i]).">
<div class='small-cell".isColor($ids[$i], $date, 0)."' id='divUp-".$ids[$i]."-$date'>amp;nbsp;</div>
<div class='small-cell".isColor($ids[$i], $date, 1)."' id='divDown-".$ids[$i]."-$date'>amp;nbsp;</div>
</div>";
}
echo '</div>';
}
function isColor($id_ma, $date, $moment) {
global $free;
for ($i = 0; $i < count($free); $i ) {
if ($id_ma == $free[$i]['id_ma']) {
if ($date >= strtotime($free[$i]['date1']) amp;amp; $date <= strtotime($free[$i]['date2'])) {
if ($free[$i]['moment'] == $moment || $free[$i]['moment'] == 2) {
$type = $free[$i]['type'];
$style = "";
if ($type > 1 amp;amp; $type < 5)
$style = " urlaub";
if ($type > 4 amp;amp; $type < 8)
$style = " frei";
if ($type > 7 amp;amp; $type < 11)
$style = " ferien";
if (($type > 22 amp;amp; $type < 34) || ($type > 37 amp;amp; $type < 48))
$style = " kurse";
if ($type > 10 amp;amp; $type < 17)
$style = " krank";
return " $style' title='".$free[$i]['remark'];
}
}
}
}
}
Большое вам спасибо за вашу помощь
Комментарии:
1. «… всего 0,03 секунды в соответствии с PHP, но я не чувствую, что это правильно …» — именно столько времени потребовалось PHP, чтобы выполнить свою работу. Остальная часть используется браузером для отображения того, что кажется довольно большим объемом данных. При этом рабочие решения, требующие рефакторинга, могут лучше подойти для сайта Code Review Stack Exchange.
2. Привет, El_Vanja, большое спасибо за ваш ответ, я не знал эту форму, я отправлю свой вопрос туда и закрою этот. [ codereview.stackexchange.com/questions/253455 /… Обзор)