как правильно распарсить текст на массив?php

    к примеру есть текст сохранится в базу как текст в одну ячейку.
    
    $data ="
    Раздел I ВСТУПЛЕНИЕ
    Пункт 1. какой-то текст
    Пункт 2. какой-то текст
    Пункт 3. какой-то текст
    
    Раздел II ПРОДОЛЖЕНИЕ
    Пункт 4. какой-то текст
    Пункт 5. какой-то текст
    Пункт 6. какой-то текст
    
    Раздел III ДОПОЛНЕНИЕ
    Пункт 7. какой-то текст
    Пункт 8. какой-то текст
    Пункт 9. какой-то текст"
    
    Как сделать из него массив, чтобы вышло:
    
    $book = [
    'chapter1' => [
        'title' => 'Раздел I ВСТУПЛЕНИЕ',
        'paragraphs' => [
            'paragraph1' => 'какой-то текст',
            'paragraph2' => 'какой-то текст',
            'paragraph3' => 'какой-то текст',
        ]
    ],
    'chapter2' => [
        'title' => 'Раздел II ПРОДОЛЖЕНИЕ',
        'paragraphs' => [
            'paragraph4' => 'какой-то текст',
            'paragraph5' => 'какой-то текст',
            'paragraph6' => 'какой-то текст',
        ]
    ],
    'chapter3' => [
        'title' => 'Раздел III ДОПОЛНЕНИЕ',
        'paragraphs' => [
            'paragraph7' => 'какой-то текст',
            'paragraph8' => 'какой-то текст',
            'paragraph9' => 'какой-то текст',
        ]
    ],
];
    
    спасибо!

Ответы (1 шт):

Автор решения: Sanya H

Самый простой вариант

<?php
$data ="
    Раздел I ВСТУПЛЕНИЕ
    Пункт 1. какой-то текст
    Пункт 2. какой-то текст
    Пункт 3. какой-то текст
    
    Раздел II ПРОДОЛЖЕНИЕ
    Пункт 4. какой-то текст
    Пункт 5. какой-то текст
    Пункт 6. какой-то текст
    
    Раздел III ДОПОЛНЕНИЕ
    Пункт 7. какой-то текст
    Пункт 8. какой-то текст
    Пункт 9. какой-то текст";
   
// разделяем на разделы 
$chapters = preg_split("/\n\s+\n/", $data);

$books = [];
foreach($chapters as $chapter) {
    // разделяем на параграфы
    $chapter = explode("\n", $chapter);
    if (count($chapter)) {
        $chapter_key = 'chapter' . (count($books)+1);
        // вытаскиваем первый параграф как заголовок
        $title = trim(array_shift($chapter));
        
        $paragraphs = [];
        foreach ($chapter as $paragraph) {
            $paragraph_key = 'paragraph' . (count($paragraphs)+1);
            $paragraphs[$paragraph_key] = trim($paragraph);
        }
        
        $books[$chapter_key] = [
            'title' => $title, 
            'paragraphs' => $paragraphs
            ];
    }
}
    
print_r($books);
→ Ссылка