leni_m
@leni_m
ЧупаКобрус

Можно ли сократить код?

При парсинге документа .docx, используя библиотеку phpWord написал код, который выводит на экран текст документа,
и проблема в том, что phpWord при парсинге выводит два типа обьектов: Text object и Textrun object.
Text object - обычный базовый текст, к которому мы можем применить echo
Textrun object - это группа текстов, т.е. может включать в себя сколь угодно Text обьектов и Textrun обьекты тоже.
foreach ($cell->getElements() as $lvl1) {
                        if ($lvl1 instanceof PhpOffice\PhpWord\Element\Text) {
                            echo $lvl1->getText();
                        } elseif ($lvl1 instanceof PhpOffice\PhpWord\Element\TextRun) {
                            foreach ($lvl1->getElements() as $lvl2) {
                                if ($lvl2 instanceof PhpOffice\PhpWord\Element\Text) {
                                    echo $lvl2->getText();
                                } elseif ($lvl2 instanceof PhpOffice\PhpWord\Element\TextRun) {
                                    foreach ($lvl2->getElements() as $lvl3) {
                                         ... // и т.д.
                                    }
                            }
                        }
                    }

и этот код работает, перебирает 3 уровня вложенности и выводит текст, но как оказалось, кол-во уровней вложенности заранее неизвестно. Предположим phpWord при парсинге выведет 100 уровней вложенности. Это надо чтоли 100 foreach писать, чтобы достучаться до текста? Чую есть более грамотный подход к этому.
  • Вопрос задан
  • 263 просмотра
Решения вопроса 3
usdglander
@usdglander Куратор тега PHP
Yipee-ki-yay
Вам необходимо познать рекурсию.

upd
Когда познаете, нужно будет написать функцию, которая:
1. Определяет есть ли следующий уровень вложенности и если есть, то выбирает этот уровень и производит вызов самой себя с этим уровнем.
2. Если следующего уровня нет, то возвращает контент из текущего уровня.
Ответ написан
Комментировать
Austin_Powers
@Austin_Powers
Web developer (Symfony, Go, Vue.js)
Почитайте про рекурсию.
Ответ написан
Комментировать
@EvgeniiR
https://github.com/EvgeniiR
/**
 * @param Text|TextRun $arg
 */
function printText($arg): void {
  if($arg instanceof TextRun) {
    foreach($arg as $el) { printText($el); }
  } elseif ($arg instanceof Text) {
    echo $arg->getText();
  } else { 
    throw new \InvalidArgumentException('...');
  }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы