@photosho

В чем ошибка при обходе дерева?

Под вечер уже мозг не работает. Помогите найти ошибку в коде. Нужно обойти дерево и вывести в виде списка на страницу:

function draw($array) {
  foreach ($array as $item) {
    if (isset($item['CHILD']))
      echo '<li>' . $item['NAME'] . '<ul>' . draw($item['CHILD']) . '</ul></li>';
    else echo '<li>' . $item['NAME'] . '</li>';
  }
}

$arr = [
  'CHILD' => [
    '16' => [
      'NAME' => '1',
      'CHILD' => [
        '17' => [
          'NAME' => 'a'
        ],

        '18' => [
          'NAME' => 'b'
        ]
      ]
    ]
  ]
];

echo '<ul>' . draw($arr['CHILD']) . '</ul>';


Результат почему-то такой:

  • a
  • b
  • 1
  • Вопрос задан
  • 148 просмотров
Решения вопроса 1
nokimaro
@nokimaro Куратор тега PHP
Проблема в том что если в самой функции делаете echo да ещё и рекурсию, то не нужно результат работы функции помешать внутрь другого echo так как в таком случае сперва отрабатывает функция, и делает echo, а потом уже отрабатывает внешнее echo.

Чтобы избежать этого, и вставлять функцию как вы хотите, нужно изменить код функции так чтобы вместо echo там был return;

Исправленный код с echo.
<?php
function draw($array)
{
    foreach($array as $item)
    {
        if(isset($item['CHILD']))
        {
            echo '<li>'.$item['NAME'].'<ul>';
            draw($item['CHILD']);
            echo '</ul></li>';
        }
        else
        {
            echo '<li>'.$item['NAME'].'</li>';
        }
    }
}

$arr = [
    'CHILD' => [
        '16' => [
            'NAME'  => '1',
            'CHILD' => [
                '17' => [
                        'NAME' => 'a'
                ],

                '18' => [
                        'NAME' => 'b'
                ]
            ]
        ]
    ]
];

echo '<ul>';
draw($arr['CHILD']);
echo '</ul>';
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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