Добавление строк к массиву в PHP

Я загрузил ассоциативный массив записей от таблицы базы данных 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, вторник, и пятница или понедельник, вторник, в среду, пятница и Находились.

5
задан ChuckO 24 May 2010 в 20:44
поделиться

3 ответа

это просто: Вы знаете, сколько "Полей" у вас есть для каждого дня? Скажем, это "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.

5
ответ дан 14 December 2019 в 13:28
поделиться

Если ваш массив ассоциативен, то почему бы при построении таблицы просто не проверить и не пропустить пустые строки? В качестве примера:

Пример 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";
      // ...
    }
  }
}
1
ответ дан 14 December 2019 в 13:28
поделиться

Не видя вашего текущего кода (как просил в комментариях Феликс Клинг), я предполагаю, что вам нужно пройтись циклом по массиву, передавая его в функцию (или передавая массив в функцию), которая проверяет 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;   
}

Вы должны получить картину.

0
ответ дан 14 December 2019 в 13:28
поделиться