Я загрузил ассоциативный массив записей от таблицы базы данных MySQL.
Массив состоит из 1 - 7 строк, представляющих одну неделю записей, которые, возможно, не были введены в течение каждого дня.
Как я могу вставить пустые строки в массив в течение недостающих дней так, чтобы я мог легко отобразить данные в таблице?
Я не должен обновлять базу данных с пробелами.
Пример:
Field1 Field2 Field3 Field4 .... Field#
Record[0]
Record[1]
Record[2]
Record[3]
Record[4]
Record[5]
Record[6]
Field4 является датой как yyyy-mm-dd
Я загружаю массив автоматически с помощью даты начала и дата окончания
Несколько недель там будут Sun, вторник, и пятница или понедельник, вторник, в среду, пятница и Находились.
это просто: Вы знаете, сколько "Полей" у вас есть для каждого дня? Скажем, это "num of fields"
$records = array_fill(0, 7, array_fill(0, <num of fields>, ''));
Что это делает, это создает пустой массив от [0] до [6] и для каждого элемента массива вставляет другой массив "Полей", с "num of fields", каждый из которых установлен на пустую строку '''
.
Теперь, когда у вас это есть, вы читаете данные из таблицы mysql, и если вы выборочно назначите $records по индексу (я предполагаю), остальные останутся пустыми.
Помните, что вы можете переназначить элемент массива $records, используя что-то вроде
$records[5] = array('New value', 'Field2 value');
что вы и делаете, когда читаете данные из таблицы mysql.
Используете ли вы какой-то индекс в таблице mysql для соответствия пронумерованному дню недели?
комментируйте здесь, если застряли с частью mysql.
Если ваш массив ассоциативен, то почему бы при построении таблицы просто не проверить и не пропустить пустые строки? В качестве примера:
Пример 1:
if ($row['Monday'] == '')
{
// draw blank template
}
else
{
// draw using live data
}
На основе добавленного примера (непроверенного; для php 5.1 и выше):
Пример 2:
for($i = 0; $i < count($Record); $i++)
{
$recordDate = strtotime($Record[$i][field4]);
$dayOfWeek = $date('N', $recordDate);
switch ($dayOfWeek)
{
case '1':
// Monday
break;
case '2':
// Tuesday
break;
// and so on...
}
}
Изменить
В приведенном выше коде предполагается, что ваши строки находятся в буднем дне. порядок, с возможными пропусками. Проблема с первым примером заключается в том, что массив не является ассоциативным, как в примере. Проблема со вторым примером заключается в том, что отсутствующая строка дня недели приводит к полностью пропущенному выводу, который может предоставить такую таблицу, как MTWFS (пропущенный четверг).
Итак, вам нужно построить цикл, который рисует каждый день недели и проверяет все строк, чтобы выбрать подходящий день для рисования. Если день не найден, рисуется пустой день:
Пример 3:
$dayNames = {'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'};
// Loop that walks the days of the week:
for($d = 1; $d < 7; $d++)
{
// Loop that checks each record for the matching day of week:
$dayFound = false;
for($i = 0; $i < count($Record); $i++)
{
$recordDate = strtotime($Record[$i][field4]);
$dayOfWeek = $date('N', $recordDate);
// output this day name in your own formatting, table, etc.
echo $dayNames[$i];
if ($dayOfWeek == $d)
{
// output this day's data
$dayFound = true;
break;
}
if (!$dayFound)
{
// output a blank template
}
}
}
Редактировать 2
Хорошо, похоже, вас больше интересует полностью заполненный массив дней недели, чем процедура вывода (я предполагал вы просто хотите нарисовать таблицы на php или что-то в этом роде). Итак, это мой пример того, как получить 7-дневный массив без пропусков:
Пример 4:
$weekData = array(); // create a new array to hold the final result
// Loop that walks the days of the week, note 0-based index
for($d = 0; $d < 6; $d++)
{
// Loop that checks each record for the matching day of week:
$dayFound = false;
for($i = 0; $i < count($Record); $i++)
{
$recordDate = strtotime($Record[$i][field4]);
$dayOfWeek = $date('N', $recordDate);
// Add one to $d because $date('N',...) is a 1-based index, Mon - Sun
if ($dayOfWeek == $d + 1)
{
// Assign whatever fields you need to the new array at this index
$weekData[$d][field1] = $Record[$i][field1];
$weekData[$d][field2] = $Record[$i][field2];
$weekData[$d][field3] = $Record[$i][field3];
$weekData[$d][field4] = $Record[$i][field4];
// ...
break;
}
if (!$dayFound)
{
// Assign whatever default values you need to the new array at this index
$weekData[$d][field1] = "Field 1 Default";
// ...
}
}
}
Не видя вашего текущего кода (как просил в комментариях Феликс Клинг), я предполагаю, что вам нужно пройтись циклом по массиву, передавая его в функцию (или передавая массив в функцию), которая проверяет Field4
и отслеживает, какие дни недели содержат данные, и заполняет недостающие дни. Это было бы проще, если бы массив был упорядочен для начала (поскольку вам нужно отслеживать только предыдущую "запись", а не всю неделю).
Сейчас я немного занят, вот некоторый pseduo-код, который нужно будет расширить и т.д.
$formattedWeek = getFormattedWeek($inputArray);
function getFormattedWeek($input) {
$nextDay = 'Sunday';
foreach ($input as $entry) {
if (date-call-that-returns-day-of-the-week !== $nextDay) {
$output[] = 'add whatever you need to your array';
} else {
$output[] = $entry;
}
$nextDay = call-to-increase-the-day-or-loop-back-to-Sunday();
}
return $output;
}
Вы должны получить картину.