Обход массива (foreach; рекурсия...)

$lider

Бывает
Добрый день.
Есть массив с элементами:
PHP:
[0] => Array
        (
            [0] => 1 //id
            [1] => Кат 1
            [2] => 0
            [3] => 0
            [4] => 0 //id родителя
            [5] => 0 //уровень вложенности
        )
    
    [1] => Array
        (
            [0] => 2
            [1] => Кат 2
            [2] => 0
            [3] => 0
            [4] => 1
            [5] => 1
        )
    
    [2] => Array
        (
            [0] => 3
            [1] => Кат 3
            [2] => 0
            [3] => 0
            [4] => 2
            [5] => 2
        )

    [3] => Array
        (
            [0] => 4
            [1] => Кат 4 
            [2] => 0
            [3] => 0
            [4] => 2
            [5] => 2
        )

    [4] => Array
        (
            [0] => 5
            [1] => Кат 5
            [2] => 0
            [3] => 0
            [4] => 2
            [5] => 2
        )

    [5] => Array
        (
            [0] => 6
            [1] => Кат 6
            [2] => 0
            [3] => 0
            [4] => 1
            [5] => 1
        )

    [6] => Array
        (
            [0] => 7
            [1] => Кат 7
            [2] => 0
            [3] => 0
            [4] => 6
            [5] => 2
        )

    [7] => Array
        (
            [0] => 8
            [1] => Кат 8
            [2] => 0
            [3] => 0
            [4] => 6
            [5] => 2
        )

    [8] => Array
        (
            [0] => 9
            [1] => Кат 9
            [2] => 0
            [3] => 0
            [4] => 6
            [5] => 2
        )

    [9] => Array
        (
            [0] => 10
            [1] => Кат 10
            [2] => 0
            [3] => 0
            [4] => 6
            [5] => 2
        )

    [10] => Array
        (
            [0] => 11
            [1] => Кат 11
            [2] => 0
            [3] => 0
            [4] => 10
            [5] => 3
        )...
Как то не могу решить задачку :(
Хочется получить путем обхода массива такую вот иерархию:
Код:
<li>Кат 1
  <ul>
    <li>Кат 2
      <ul>
        <li>Кат 3</li>
        <li>Кат 4</li>
        <li>Кат 5</li>
      </ul>
    </li>
    <li>Кат 6
      <ul>
        <li>Кат 7</li>
        <li>Кат 8</li>
        <li>Кат 9</li>
        <li>Кат 10
          <ul>
            <li>Кат 11</li>
          <ul>
        </li>
      </ul>
    </li>
  </ul>
</li>
Ну и т.д. по всей структуре вложенности.
Что то я запутался совсем с foreach и рекурсией :(
 

С.

Продвинутый новичок
Вопроса не прозвучало, кода не показано. Как старый телепат пресказываю, вопрос должен бы быть такой: "Напишите этот код за меня".
Угадал?
 

$lider

Бывает
Не, за тебя я точно код писать не буду...
Хочется пример кода по рекурсии.
Что бы алгоритм уловить...
 

Фанат

oncle terrible
Команда форума
алгоритм кода по рекурсии очень простой.
рекурсия - это когда код вызывает сам себя.
к примеру, обход массива
PHP:
funсtion trace($arr) {
  foreach ($arr as $el) {
    if (is_array($el)) trace($el);
    else echo $el;
  }
}
перебираем массив по очереди, если элемент является скаляром - то выводим, а если массивом - то напускаем эту же функцию, вызываем сами себя.
 

$lider

Бывает
Почитал в инете, посмотрел примеры.
Ну вот что то типа того получилось.
Решил через for
Всем спасибо.

PHP:
function tree($parent) {
  global $array, $_key;
  $out='<ul>';
  for($i=0; $i<count($_key); $i++) {
    $elem = $array[$_key[$i]];
    if($elem[4]!=$parent) continue;
    $out .= '<li>'.$elem[1];
    $out .= items($elem[0]);
    $out .= '</li>';
  }
  $out .= '</ul>';
  return $out;
}
$_key = array_keys($array);
echo tree(0);
 

$lider

Бывает
Еще вопрос: если элемент не имеет подчиненных, то накапливаются пустые <ul></ul> (строки 3;11).
Как бы обойти это дело.
Подскажите.

p.s. какой то счетчик применить наверное нужно
 

С.

Продвинутый новичок
Проверить $elem[0] перед тем, как его рекурсировать разве нельзя?
 
Сверху