Я строю систему ротации / календаря, и в определенный момент я борюсь из-за недостатка знаний о массивах PHP.
Для этой конкретной проблемы у меня есть две ячейки с датами, 17/08/2017 и 18/08/2017. В те дни 2 сотрудника сменяются, и я надеюсь, что смогу повторить эти два вопроса. инициалы и смещение значения в соответствующую ячейку.
Ниже приведен запрос, и что я сейчас делаю с
$query_show_rota='SELECT * FROM `rota` INNER JOIN users ON users.uid=rota.staffmember WHERE "'.$this->currentDate.'" >= `rotastart` AND "'.$this->currentDate.'" <= `rotaend`';
$db = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE);
$result=mysqli_query($db,$query_show_rota);
if (!$result) {
printf("Error: %s\n", mysqli_error($db));
exit();
}
while($row = mysqli_fetch_array($result,MYSQLI_ASSOC)) {
$rota_initials_loop_array = array();
array_push($rota_initials_loop_array, $row['initials']);
print_r($rota_initials_loop_array);
echo $this->currentDate . " - ";
echo $row['initials'] . " ";
echo $row['shift'] . "<br />";
}
(некоторые из вышеперечисленных, например, эхо в цикле while, предназначены для тестирования)
Это приводит к следующим данным, возвращаемым из MySQL (некоторые поля удалены для удобства просмотра):
| rid | staffmember | initials | rotastart | rotaend | shift |
| 6 | 1 | DB | 2017-08-17 | 2017-08-18| 1430 |
| 7 | 6 | LG | 2017-08-17 | 2017-08-18| 0800 |
(2 дня для каждого сотрудника, где оба сотрудника находятся в смене)
В браузере за пределами ячеек календарного дня я вижу:
Array ( [0] => DB ) 2017-08-17 - DB 1430
Array ( [0] => LG ) 2017-08-17 - LG 0800
Array ( [0] => DB ) 2017-08-18 - DB 1430
Array ( [0] => LG ) 2017-08-18 - LG 0800
(результат тестирования print_r и echo в моем коде далее)
Я не буду беспокоить вас циклом и кодом генерации ячеек для каждого календарного дня, но в нем есть следующее:
<?php
foreach($rota_initials_loop_array as $initials_value):
echo $initials_value
endforeach;
}
?>
Но я не получаю абсолютно никаких данных, напечатанных в каждой ячейке дня. И я не слишком уверен, почему. Главным образом потому, что я впервые коснулся массивов в PHP. Я даже не знаю, должен ли я использовать массив для этого? Я работал без сбоев, когда возвращалась только 1 строка, это было до того, как я превратил строку $ в цикл while и т. Д.
Я открыт для предложений, как это сделать иначе? По сути, я хочу получить 2x div в каждой дневной ячейке, которые содержат входные данные и смену каждого сотрудника, поэтому «БД — 1430» в одном делении в день X и «LG — 0800» в другом div под ним в тот же день X. Затем то же самое для дня Y.
По сути, я хочу получить 2x div в каждой дневной ячейке, которые содержат входные данные и смену каждого сотрудника, поэтому «DB — 1430» в одном div в день X и «LG — 0800» в другом div ниже того же день X. То же самое для дня Y.
Итак, вам нужно сгенерировать ваш массив с датами в качестве ключей. Что-то похожее на это:
$data = [
'day-x' => [
['DB', '1430'],
['LG', '0800'],
],
'day-y' => [
...
]
];
Несмотря на то, что вы пытались тщательно объяснить существующий код, я не могу сказать, что могу визуализировать структуру данных, поэтому приведенный ниже цикл while должен быть адаптирован для соответствия вашим данным.
Предполагая, что вы каким-то образом получите все компоненты дерева данных (дата, начальный, сдвиг) в каждой строке, вы можете получить массив в форме, подобной той, что я дал выше, с этим:
$data = [];
while($row=mysqli_fetch_assoc($result)) {
if(!array_key_exists($row['date'], $data)) {
$data[$row['date']] = [];
}
$data[$row['date']][] = [$row['initials'], $row['shift']];
}
На этом этапе вам будет лучше, если вы json_encode и отправите данные в браузер. Это, однако, потребовало бы кардинальных изменений (использование ajax для получения календарных данных и рендеринг с использованием javascript). Если вы хотите продолжить генерировать HTML в PHP, вот как вы потребляете $data
массив:
$html = '';
foreach($data as $date => $events) {
$html .= '<div class="day">
<span class="day-number">' . $date . '</span>';
foreach($events as $event) {
$html .= '<span class="event">' . $event[0] . ' - ' . $event[1] . '</span>';
}
$html .= '</div>';
}
Других решений пока нет …