Как из текстового файла создать ассоциативный массив PHP?

184
29 августа 2021, 07:10

Формат текстового файла:

1)вопрос 1
&
autofocus
multiple
autocomplete
placeholder
*required
&
2)вопрос 2
&
:first
:first-line
:after
*:before
:first-child
&

Результат

$test = array(
 $quest1 = array('ans1' => 'autofocus', 'ans2' => 'multiple', 'ans3' => 'multiple', 'ans4' => 'multiple', 'ans5' => '*required'),
 $auest2 = array('ans1' => ':first', 'ans2' => ':first-line', 'ans3' => ':after', 'ans4' => '*:before', 'ans5' => ':first-child')
);

Или можно ли как то по другому преобразовать в ассоциативный массив?

Answer 1
<?php
$handle = fopen("sem.txt", "r");

while (!feof($handle)) {
    $buffer[] = fgets($handle, 4096);
}
fclose($handle);
print_r(array_chunk($buffer, 9, true));
?>
Answer 2

Правильно заданный вопрос, говорят, содержит половину ответа. Было бы куда проще и понятнее, если бы вы определили ФОРМАЛЬНЫЕ правила, по которым строится входной файл и как он должен разойтись в выходной.

Допустим такие:

  • Каждый вопрос начинается со строки с текстом вопроса
  • Затем следует строка с единственным символом &
  • Затем идут варианты ответа, каждый на новой строке, количество вариантов ответа может быть любым.
  • Строка с правильным вариантом ответа начинается с символа *
  • Список вариантов ответа завершается строкой с единственным символом &
  • Между вопросами присутствуют пустые строки.

И так далее. Определив формальные правила очень легко составить программу, которая по ним разберёт файл. Например так:

<?php
   $f = fopen('q.txt', 'r') or die('Не могу открыть файл');
   $quiz = array();
   while (!feof($f)) { // Пока не дойдём до конца файла
     $s = trim(fgets($f));
     if (!empty($s)) { // Если попалась непустая строка - это наш вопрос 
       $question = $s;
       if (trim(fgets($f)) != '&') 
         throw new Exception('После вопроса должна быть строка с символом &');
       $answers = array(); // Массив вариантов ответа
       $right_answer = false; // Правильный вариант ответа
       for(;;) {
         $s = trim(fgets($f));
         if (empty($s)) 
           throw new Exception('В конце списка ответов должна быть строка с символом &');
         if ($s == '&') 
           break; // Завершаем начитывание ответов, когда найдём &
         $id = 'ans' . (count($answers) + 1); // Ключ элемента с ответом
         if (substr($s, 0, 1) == '*') { // Если первый символ - звёздочка
           if ($right_answer !== false) // Если уже был один правильный ответ
             throw new Exception('Допускается только один правильный вариант ответа');
           $right_answer = $id; // Запомним ключ правильного варианта
           $s = substr($s, 1); // Отрежим звёздочку от текста ответа
         }
         $answers[$id] = $s; // Запишем ответ в массив
       }
       if ($right_answer === false) // Если правильный ответ не задан среди вариантов
         throw new Exception('Ни один из вариантов ответа не указан как правильный');
       // Добавляем информацию по вопросу в результирующий массив
       $quiz[] = array(
           'question' => $question,
           'answers' => $answers,
           'right_answer' => $right_answer
         );
     }
   }
   fclose($f); // Закрываем файл
   print_r($quiz);

где q.txt - текстовый файл с примером из вопроса.

Вывод будет выглядеть так:

Array
(
    [0] => Array
        (
            [question] => 1)вопрос 1
            [answers] => Array
                (
                    [ans1] => autofocus
                    [ans2] => multiple
                    [ans3] => autocomplete
                    [ans4] => placeholder
                    [ans5] => required
                )
            [right_answer] => ans5
        )
    [1] => Array
        (
            [question] => 2)вопрос 2
            [answers] => Array
                (
                    [ans1] => :first
                    [ans2] => :first-line
                    [ans3] => :after
                    [ans4] => :before
                    [ans5] => :first-child
                )
            [right_answer] => ans4
        )
)
READ ALSO
Определить у кого больше записей php

Определить у кого больше записей php

Господа и дамы! Как вывести пользователя у кого больше выполненных заданийТаблица users и таблица quests_active (сюда записываются id заданий и id пользователей)...

93
Ошибка Notice: Undefined index: payment_method

Ошибка Notice: Undefined index: payment_method

Слегка отредактировал стандартный модуль OcStore 23 под себя, модуль вроде бы работает, всё считает, но выдаёт такую ошибку:

97
Безопасная передача переменной из php в js

Безопасная передача переменной из php в js

Как безопасно передать содержимое переменной php в переменную js при условии, что фильтрацию и экранирование символов выполнить невозможно?

145
Подключена ли библиотека?

Подключена ли библиотека?

Как определить,была ли подключена библиотека математических функций?

130