gleber1
@gleber1

В чем разница между этими примерами php?

Есть дерево
List:
name
description
List
Все примеры я делал сам, в общем то это даже не пример а одна и та же функция над которой велся эксперимент
private function recursive($list)
    {
        foreach($list as $element){
            if(is_array($element)){
                $this->recursive($element);
            }else{
                dump($element);
            }
        }
    }

Пример 1 (рабочий)
private function recursive($list)
    {
        if(isset($list['list'])){
            foreach($list['list'] as $element){
                $this->recursive($element);
            }
        }else{
            dump($list['name']);
            dump($list['description']);
        }
    }

Пример 2 нерабочий потому что раскрывает почему то 5 элементов дерева хотя на момент их всего 11 было.
Вопрос что с ним не так?
private function recursive($list)
{
   foreach($list as $element){
          dump($element);
          if(isset($element['list'])){
               $this->recursive($element['list']);
          }
   }
}

Пример 3
Забавно но этот пример выводит один раз только хотя дубляж как по мне первого варианта.Почему так?
private function recursive($list)
    {
        if(isset($list['list'])){
            $this->recursive($list['list']);
        }else{
            dump($list['name']);
            dump($list['description']);
        }
    }

Пример 4 (18+) кладет на лопатки сервер и выбивается все на свете
  • Вопрос задан
  • 322 просмотра
Пригласить эксперта
Ответы на вопрос 1
@dmitryKovalskiy
программист средней руки
Ну в последнем варианте у вас вроде нет вывода. Так что что там будет при раскрутке рекурсии - мне не понятно. В первых двух разница есть довольно большая. В первом случае происходит проверка - если элемент List, то нырять глубже и она очевидна, во втором вы проверяете какой-то флаг ($list['closureTag']), который в вопросе вроде не описан, поэтому сказать какие элементы пройдут проверку я не могу.

UPD: Код сильно переписан, так что мой ответ по большой части не актуален, но всеже внесу правки. Заметьте что в первом коде не используются ни индексы, ни строковые константы. Знаете почему? потому что любая опечатка и сразу - "Счастливой отладки". Поддерживать такое тоже сложно, потому что переименовывать поля становится весело и задорно. Хрен знает где они использовались в старом виде. Далее - в чем главный баг. У вас вывод делается ТОЛЬКО если у узла нет наследников. Т.е. вы выводите только кончики. Это правильно?
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы