Nano Hash - криптовалюты, майнинг, программирование

Как использовать метод с RegEx для печати в динамическую таблицу с помощью PHP

У меня есть список курсов и часов, которые они требуют для студентов, чтобы пройти их. Курсы следующие:

CON8101 Residential Building/Estimating 16 hrs/w 
CON8411 Construction Materials I 4 hrs/w 
CON8430 Computers and You 4 hrs/w 
MAT8050 Geometry and Trigonometry 4 hrs/w 

Я использовал это регулярное выражение, чтобы извлечь название курса и количество часов, которое каждый курс занимает каждую неделю. Есть более 4 курсов, 4 приведены выше. Курсов может быть до 50.

$courseHoursRegEx = "/\s[0-9]{1,2}\shrs/w/";
$courseNameRegEx = "/[a-zA-Z]{3}[0-9]{4}[A-Z]{0,1}\s?/[a-zA-Z]{3,40}/";

И применил следующую функцию (не уверен, что на 100% прав) для извлечения строк RegEx. Используя переменную $courseLine, я сохранил строку каждой строки из текстового документа, который я открыл ранее. Он отслеживает общее количество часов, извлеченных из строки.

$courses – это набор флажков, которые пользователь устанавливает в разделе HTML

$totalHours += GetCourseHours($courseLine);
function GetCourseHours($couseLine)
    {
        if(!preg_match($courseHoursRegEx, $courseLine))
            {
                return $courseLine;
            }
    }
function GetCourseName($courseLine)
    {
        if(!preg_match($courseNameRegEx, $courseLine))
            {
                return $courseLine;
            }
    }

Я использовал цикл foreach для вывода всех выбранных курсов для сортировки в таблице.

foreach($courses as $course)
    {
    $theCourse = GetCourseName($course);
    $theHours = GetCourseHours($course)
    }

Изменить: выходной код

for($i = 1; $i <= $courses; ++$i)
{
printf("<tr><td>\$%.2f</td><td>\$%.2f</td></tr>", $theCourse, $theHours);

}

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

27.09.2012

  • Вы не включили свой выходной код, поэтому трудно понять, в чем проблема; но ваш пример кода устанавливает $theCourse и $theHours при каждом прогоне, поэтому единственное значение, которое вы получите в конце цикла, - это окончательный курс. 27.09.2012
  • Ладно, тут сразу одна ошибка. Вы использовали / в качестве разделителя И в своем регулярном выражении. Либо экранируйте его в регулярном выражении (\/), либо измените разделитель на что-то вроде ~ или #. 27.09.2012

Ответы:


1

Прежде всего, (после исправления нескольких незначительных вещей в регулярных выражениях) вы можете сделать все это за один вызов preg_. Вот как:

preg_match_all("~([a-zA-Z]{3}\d{4}[A-Z]{0,1}\s.+)\s(\d{1,2})\shrs/w~", $str, $matches);

$str может быть многострочной строкой со всеми строками одновременно. Или вы можете пройти по одной строке за раз. Если вы передадите все строки сразу, $matches после этого будет выглядеть так:

Array
(
    [0] => Array
        (
            [0] => CON8101 Residential Building/Estimating 16 hrs/w
            [1] => CON8411 Construction Materials I 4 hrs/w
            [2] => CON8430 Computers and You 4 hrs/w
            [3] => MAT8050 Geometry and Trigonometry 4 hrs/w
        )

    [1] => Array
        (
            [0] => CON8101 Residential Building/Estimating
            [1] => CON8411 Construction Materials I
            [2] => CON8430 Computers and You
            [3] => MAT8050 Geometry and Trigonometry
        )

    [2] => Array
        (
            [0] => 16
            [1] => 4
            [2] => 4
            [3] => 4
        )

)

Теперь вы можете просто перебрать все имена в $matches[1] и суммировать часы в $matches[2]. Обратите внимание, что эти два внутренних массива соответствуют тому, что находится внутри круглых скобок, которые я использовал в регулярном выражении. Это так называемые подшаблоны, и они захватывают дополнительные (под-)совпадения. Также $matches[0] всегда будет содержать полное совпадение всего шаблона, но в данном случае вам это не нужно.

27.09.2012
  • Это многомерный массив? Итак, если мне нужны названия курсов, мне нужно вызвать $matches[1][1] для CON8411 Construction Materials I? 30.09.2012
  • @GivenPie да, это так. $matches[1] сам по себе является массивом всех названий курсов. $matches[2] сам по себе является массивом всех часов. Итак, как вы говорите, $matches[1][1] даст вам имя и $matches[2][1] соответствующие часы. 30.09.2012
  • Нужен ли конструктор для создания массива? Я просто оставил его, как только мне не удалось var_dump($matches), который ничего не равен массиву, но var_dump($matches[1][1]) выходит нулевым. Можно ли заменить $str на $arraySessionVariable? 30.09.2012
  • Плохо, я не понимал, как я могу интегрировать этот метод в свою проблему, теперь я вижу некоторый свет. 30.09.2012
  • Нет необходимости в конструкторе или что-то еще. Просто вставьте $str, который представляет собой многострочную строку всех ваших курсов (всего одного курса; в этом случае вам даже не нужен preg_match_all, а другой цикл). Вы можете вызвать $matches = array(); заранее, но в PHP это не обязательно. Так что просто вызовите функцию preg_match_all с вашей строкой курса, как я ее дал, а затем попробуйте var_dump($matches); после этого. 30.09.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..