Разбор файла * .TXT

У меня есть текстовый файл с информацией ниже:

1. What color is the water?
Red
*Blue
Green
Orange

2. Stack Overflow is awesome.
*True
False

3. Explain why you love code:

Я хотел бы, чтобы на выходе было что-то вроде этого:

MC What color is the water? Red Incorrect Blue Correct Green Incorrect Orange Incorrect
TF Stack Overflow is awesome. True
ES Explain why you love code:

* В вопросе 1 и 2 символизируют правильный ответ. В основном я пытаюсь создать код PHP, который может определить тип вопроса и пометить его с помощью MC для множественного выбора, TF для True / False и ES для эссе. Я не уверен, как подойти к этому. Будем очень благодарны любой помощи.

0

Решение

Вот немного больше описания того, как вы могли бы сделать это вместе с некоторым кодом, который вы можете изменить. Обратите внимание, что это не код производственного класса.

теория

  • Читать файл построчно
  • Если строка начинается с (то есть совпадает) цифр, за которыми следуют точка и пробел, запомните вопрос в массиве как ключ
  • Если строка не совпадает, запомните каждую строку в массиве ответов
  • Когда мы нажимаем на следующую строку, которая соответствует, все ответы, собранные до сих пор, связывались с предыдущим вопросом.
  • После завершения цикла у нас все еще может быть массив, полный ответов. Если мы это сделаем, свяжите это с последним вопросом, который мы прочитали

На данный момент у нас есть вопросы и ответы на викторины, заполненные в виде связанного массива, который выглядит следующим образом:

Array
(
[1. What color is the water?] => Array
(
[0] => Red
[1] => *Blue
[2] => Green
[3] => Orange
)

[2. Stack Overflow is awesome.] => Array
(
[0] => *True
[1] => False
)

[3. Explain why you love code:] =>
)

Теперь мы перебираем вопросы и получаем ответ типа ES, TF или MC. Мы также хорошо форматируем ответы. А затем отобразите это.

практика

Создайте функцию, которая читает файл и создает такой массив для нас.

/**
* Get questions and answers from file
*
* @param $filename string Name of the file along with relative or absolute path
*
* @returns array Associated array of 'question1'=>array-of-answers, 'question2'=>array2-of-answers
*/
function getQuestionsAndAnswers($filename)
{
$file = @fopen($filename, 'r');

$quiz = array();        // associated array containing '1. question1'=>answer array
$answers = array();     // temporarily holds answers
$question = '';         // temporarily holds questions

while (($line = fgets($file)) != null)
{
$line = trim($line);
if ($line === '') continue;

if (preg_match('/^\d+\. /', $line) === 1)
{
if (count($answers) > 0)
{
$quiz[$question] = $answers;
$answers = array();
}
$question = $line;
$quiz[$question] = '';
}
else
{
$answers[] = $line;
}
}

if (count($answers) > 0)
{
$quiz[$question] = $answers;
}

return $quiz;
}

Создайте функцию, которая принимает ответы и сообщает нам, какой это тип ответа.

/**
* Get answer type short code from answer array
*
* @param $answer array Answers
*
* @returns string Short code answer type (e.g. ES for Essay, TF for True/False, MC for multiple choice)
*/
function answerType($answer)
{
if (!is_array($answer)) return 'ES';
$flattenedAnswer = implode(',', $answer);
if (stripos($flattenedAnswer, 'true') !== false) return 'TF';
return 'MC';
}

Создайте функцию, которая хорошо форматирует наши ответы

/**
* Format answers based on answer type
*
* @param $answer array      Answers
* @param $answerType string Short code of answer type
*
* @returns string Formatted answer
*/
function answers($answer, $answerType)
{
if ($answerType === 'ES') return $answer;

if ($answerType === 'TF')
{
foreach ($answer as $x)
{
if (strpos($x, '*') === 0) return substr($x, 1);
}
return '';
}

$flattenedAnswer = '';
foreach ($answer as $x)
{
if (strpos($x, '*') === 0)
{
$flattenedAnswer .= ' ' . substr($x, 1) . ' Correct';
}
else
{
$flattenedAnswer .= " $x Incorrect";
}
}
return $flattenedAnswer;
}

Теперь, когда у нас есть основополагающие элементы, давайте соберем все это вместе.

// $quiz will be populated as an array that looks like this
// 'question1'=>array('answer1', 'answer2')
// 'question2'=>array('answer1', 'answer2') etc
$quiz = getQuestionsAndAnswers('./questions.txt');

// loop through all questions and use functions to format the output
foreach ($quiz as $question=>$answer)
{
$answerType = answerType($answer);
echo sprintf("%s %s %s\n",
$answerType,
$question,
answers($answer, $answerType)
);
}

Давайте запустим код и посмотрим результат:

$ php questions.php
MC 1. What color is the water?  Red Incorrect Blue Correct Green Incorrect Orange Incorrect
TF 2. Stack Overflow is awesome. True
ES 3. Explain why you love code:

Отлично. Похоже, все получилось. Я надеюсь, что код самокомментируется, но если у вас есть вопросы, не стесняйтесь спрашивать.

1

Другие решения

Ответить на ваш вопрос; вы могли бы использовать .ini файлы, а не .txt файлы. Проверь это parse_ini_file это возвращает массив. Или если вам действительно нужно .txt вы могли бы использовать file_get_contents (возвращает строку) …

Или вы могли бы попробовать; база данных. Что лучше.

1

В идеале это должно быть в базе данных с двумя таблицами вопросов и ответов, где отношение — это номер вопроса. Вы можете использовать file_get_contents (), но требуется много кода. Если вы хотите использовать плоский файл, вы должны планировать использовать:
Формат с разделителями, где каждый вопрос делится на «:» (например), а каждая часть вопроса делится на «,», а каждый ответ делится на «;» первый ответ правильный и file_get_contents () для загрузки текстового файла и explode () делит вопрос, части и ответы на массивы и использует оператор for для зацикливания каждого массива. например.
Какого цвета вода? Синий, Красный, Зеленый, Оранжевый: Переполнение стека — это круто. Верно; Неверно. Объясните, почему вы любите код:

0
По вопросам рекламы [email protected]