PHP-цикл while для генерации HTML: нужно ли проверять значения массивов при каждой итерации цикла цикла или использовать обработку строк после цикла? - PullRequest
0 голосов
/ 20 июня 2011

Я работаю над PHP-написанным html-календарем, который записывает каждый день месяца в цикле while.

Каждый день месяца находится внутри пары тегов, и определенным дням нужен атрибут titleв теге.Эти дни будут получены из базы данных MySQL и сохранены в массиве, подобном следующему: $ array ($ day_number => $ amount).

Примером массива может быть: (3 => 5, 12 => 4, 15 => 6, 22 => 10, 27 => 2, 31 => 4).Массив будет содержать ключи только для тех дней, когда количество не равно нулю.

Я могу придумать два способа сделать это.Мне интересно, какой из них более эффективен, или если есть другой, лучший способ.

Вариант 1.) Проверяйте массив на каждой итерации цикла создания html, чтобы увидеть, содержит ли он соответствующий день.Если это так, добавьте соответствующий атрибут title к тегу.Поэтому я бы использовал что-то вроде:

$day = 1;
while($day < 31) {
if(array_key_exists($day,$array)) {
echo "<td title=\"$array['$day'] spots available\">$day</td>";
}
else echo "<td title\"No spots available for this date\">$day</td>";
$day++;
}

2.) Используйте цикл, чтобы поместить весь календарь в строковую переменную, затем используйте строковые функции для вставки специальных атрибутов заголовка.

$day = 1;
while($day < 31) {
$month .= "<td>$day</td>";
$day++;
}
foreach($array as $day_number=>$quantity) {
$month = str_replace("<td>$day_number</td>","<td title=\"$quantity spots available\">$day_number</td>",$month)
}

В этом приложении любой метод будет выполнен очень быстро, но мой вопрос носит более общий характер.Лучше использовать строковые функции после цикла, который создает базовый HTML, или для проверки / обработки на каждой итерации?Или есть третий, лучший способ?

Я изучил PHP полностью самостоятельно, используя интернет-ресурсы, поэтому я не представляю, насколько плохим может быть мое кодирование.Любая помощь приветствуется.

Спасибо.

1 Ответ

1 голос
/ 21 июня 2011

Вот еще одно решение:

$day = 1;
$strings = array();
while($day < 31) {
    if (array_key_exists($day, $array)) {
        $strings[$day] = $array['$day'] . " spots available";
    } else {
        $strings[$day] = "No spots available for this date";
    }
    $day += 1;
}
foreach ($strings as $day => $string) {
    echo '<td title="' . $string . '">' . $day . '</td>';
}

Что в этом такого особенного?Ну, во-первых, скорее всего, это будет медленнее, чем ваше решение, так как я зацикливаюсь 31 раз, дважды!Но этот пример настолько тривиален, что производительность не является вашей главной задачей.Ваша главная задача - написание настолько простого кода, что любой может его понять.

Код PHP становится очень сложным, если у вас много HTML-печати.Обычно вы хотите создать какую-то модель (adhoc или систематическую), которая собирает все ваши данные и печатает их только в HTML как самый последний шаг.

Научитесь разделять сбор данных и модельшаг генерации из шага HTML-печати.Это может показаться излишним и пустой тратой мощности процессора и памяти, а что нет, но что дороже: ваше время и здравомыслие или какой-нибудь сервер в горячей комнате?;)


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

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