Добавление строк в массив в PHP - PullRequest
4 голосов
/ 25 мая 2010

Я загрузил ассоциативный массив записей из таблицы базы данных MySQL.

Массив состоит из 1-7 строк, представляющих одну неделю записей, которые не могли быть введены для каждого дня.

Как я могу вставить пустые строки в массив для пропущенных дней чтобы я мог легко отобразить данные в таблице?

Мне не нужно обновлять базу данных пробелами.

Пример:

             Field1  Field2  Field3  Field4 .... Field#  
Record[0]
Record[1]
Record[2]
Record[3]
Record[4]
Record[5]
Record[6]

Поле4 - это дата в формате гггг-мм-дд

Я загружаю массив автоматически, используя дату начала и дату окончания

Через несколько недель будет Солнце, Вт и Пт или Пн, Вт, Ср, Пт и Сб.

Ответы [ 3 ]

4 голосов
/ 28 мая 2010

это просто: Знаете ли вы, сколько «полей» у вас есть на каждый день? скажем, это «количество полей»

$records = array_fill(0, 7, array_fill(0, <num of fields>, ''));

что он делает, это создает пустой массив от [0] до [6] и для каждого элемента массива вставляет другой массив «Поля» с «количеством полей», каждому из которых присваивается пустая строка ''.

Теперь, когда у вас есть это, вы читаете свои данные из таблицы mysql, и если вы выборочно назначаете $ records по индексу (я предполагаю), остальные из них останутся пустыми.

Имейте в виду, что вы можете переназначить элемент массива $ records, используя что-то вроде

$records[5] = array('New value', 'Field2 value');

, что вы делаете, когда читаете данные из таблицы MySQL.

Используете ли вы какой-то индекс в своей таблице mysql, чтобы соответствовать нумерованному дню недели?

прокомментируйте здесь, если вы застряли с частью mysql.

1 голос
/ 25 мая 2010

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

Пример 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";
      // ...
    }
  }
}
0 голосов
/ 25 мая 2010

Не видя ваш текущий код (как было запрошено в комментариях Феликса Клинга), я предполагаю, что вам нужно будет перебрать свой массив, передать его функции (или передать массив функции), которая проверяет Field4 и отслеживает, какие дни этой недели содержат данные, и заполняет эти пропущенные дни. Это было бы проще, если бы массив был для начала (так как вам нужно было бы отслеживать только предыдущую «запись», а не всю неделю).

Я сейчас немного занят, вот какой-то псевдо-код, который нужно будет расширить и т. Д.

$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;   
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...