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 писать, чтобы достучаться до текста? Чую есть более грамотный подход к этому.
  • Вопрос задан
  • 226 просмотров
Решения вопроса 4
usdglander
@usdglander Куратор тега PHP
Yippee ki-yay
Вам необходимо познать рекурсию.

upd
Когда познаете, нужно будет написать функцию, которая:
1. Определяет есть ли следующий уровень вложенности и если есть, то выбирает этот уровень и производит вызов самой себя с этим уровнем.
2. Если следующего уровня нет, то возвращает контент из текущего уровня.
Ответ написан
Austin_Powers
@Austin_Powers
Web developer (Symfony)
Почитайте про рекурсию.
Ответ написан
l3ftoverz
@l3ftoverz Куратор тега PHP
Rings of Saturn - The Husk
Рекурсия. Она тебе нужна.
Ответ написан
@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('...');
  }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Алгоритмика Москва
от 110 000 до 160 000 руб.
N1.RU Новосибирск
от 100 000 руб.
Living Core Казань
от 50 000 руб.
17 сент. 2019, в 09:53
500 руб./в час
17 сент. 2019, в 07:36
500 руб./за проект
17 сент. 2019, в 05:19
4000 руб./за проект