Как создать таблицу с более чем 5 условиями - PullRequest
1 голос
/ 01 февраля 2012

Short

Генерация таблицы со штрих-кодами предметов. Каждое изделие имеет точное количество в таблице базы данных. Поля в таблицах ограничены: 65, если больше 65, то построить вторую таблицу, а затем третью ... Как генерировать таблицы с этими условиями?

enter image description here

Подробное

Допустим, мы хотим сгенерировать таблицу с 65 доступными полями (5x13).

Мой план следующий

  1. Пользователь выбирает чекбоксы элементов
  2. Когда пользователь отправляет форму, PHP получает значения отмеченных флажков
  3. PHP получает количество каждого элемента из базы данных
  4. Генераторный стол

Например количество для элемента с идентификатором 55 равно 2, а для 56 - 4, тогда таблица должна выглядеть следующим образом

enter image description here

Мой код выглядит так (я знаю, что это неправильно, но я не могу понять, как это должно быть. Должно быть более 5 счетчиков: счетчик строк, счетчик столбцов, счетчик $ _POST ['id'], счетчик количества товаров, счетчик таблицы (если общая сумма превышает 65)

UPDATE

    <?php
            $items = array();
            foreach ($_POST['checkbox'] as $id) {
                $stmt = $db->prepare("SELECT `qt` FROM `items` WHERE `id`=?");
                $stmt->bind_param('i', $id);
                $stmt->execute();
                $stmt->bind_result($qt);
                $stmt->fetch();
                $stmt->close();
                for ($cnt = 1; $cnt <= $qt; $cnt++)
                    $items[] = $id;
            }
            $i = 0;
            foreach ($items as $item) {
                for ($j = 0; $j < $item['quantity']; $j++) {

                    // check if it's the beginning of a new table
                    if ($i % 65 == 0)
                        echo '<table>';

                    // check if it's the beginning of a new row
                    if ($i % 5 == 0)
                        echo '<tr>';

                    echo '<td><img src="bc.php?id=' . $item['id'] . '" alt="' . $item['name'] . '" /></td>';

                    // check if it's the end of a row
                    if (($i - 1) % 5 == 0)
                        echo '</tr>';

                    // check if it's the end of a table
                    if (($i - 1) % 65 == 0)
                        echo '</tr></table>';

                    $i++;
                }
            }

// if the last row wasn't closed, close it
            if ($i % 5 != 0)
                echo '</tr>';

// if the last table wasn't closed, close it
            if ($i % 65 != 0)
                echo '</table>';
            ?>

Есть предложения?

Ответы [ 3 ]

1 голос
/ 01 февраля 2012

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

data rows = resultOfMyQuery();
int index = 0;
while(index < rows.count()) {
 index = createASheet(rows, index);
}
END;

int createASheet(data rows, int index) {
  int availableCells = 65;
  int column = 0;
  print("<table>");
  while (availableCells > 0) {
    if (index < rows.count()) {
      data row = rows.get(index);
      int quantity = row.getQuantity();
      if (quantity > availableCells) {
        // Stay on this item with reduced quantity for next sheet.
        row.setQuantity(quantity - availableCells);
        rows.set(index, row);
      } else {
        // Move on to next item on this (or next) sheet.
        index++;
      }
      for (i=0; i<quantity && availableCells>0; quantity--) {
        column = makeACell(column, StringFormat("<TAG ATTRIB='%d'></TAG>",row.getId()));
        availableCells--;
      }
    } else {
      // fill in empty cells
      column = makeACell(column, "");
      availableCells--;
    }
  }
  print("</table>");
  return index;
}

int makeACell(int column, String filling) {
  String cell = "";
  if (column == 0) {
    cell.append("<tr>");
  }
  cell.append("<td>").append(filling).append("</td>");
  if (column == 4) {
    cell.append("</tr>");
  }
  print cell;
  return (column+1) % 5;
}
1 голос
/ 01 февраля 2012

РЕДАКТИРОВАТЬ 4

<?php

$i = 0;
foreach ($_POST['checkbox'] as $id) {
    $stmt = $db->prepare("SELECT `qt` FROM `items` WHERE `id`=?");
    $stmt->bind_param('i', $id);
    $stmt->execute();
    $stmt->bind_result($qt);
    $stmt->fetch();
    $stmt->close();

    for ($cnt = 1; $cnt <= $qt; $cnt++) {
        // check if it's the beginning of a new table
        if ($i % 65 == 0)
            echo '<table>';

        // check if it's the beginning of a new row
        if ($i % 5 == 0)
            echo '<tr>';

        echo sprintf('<td><img src="bc.php?id=%1$d" alt="%1$d" /></td>', $id);

        // check if it's the end of a row
        if (($i + 1) % 5 == 0)
            echo '</tr>';

        // check if it's the end of a table
        if (($i + 1) % 65 == 0)
            echo '</table>';

        $i++;
    }
}

// if the last table isn't full, print the remaining cells
if ($i % 65 != 0) {
    for ($j = $i%65; $j < 65; $j++) {
        if ($j % 65 == 0) echo '<table>';
        if ($j %  5 == 0) echo '<tr>';
        echo '<td></td>';
        if (($j + 1) %  5 == 0) echo '</tr>';
        if (($j + 1) % 65 == 0) echo '</table>';
    }
}
0 голосов
/ 01 февраля 2012

Почему вы не используете существующую систему штрих-кодов, такую ​​как QR-коды? Эти стандарты предлагают библиотеки для создания кодов и доступны для чтения различными устройствами.

Если вы действительно хотите создать свой собственный штрих-код, я настоятельно рекомендую использовать двоичную систему для хранения ваших значений. Подумайте и о контрольных суммах.

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