Пытаюсь реализовать каталог n-вложенности на PHP

121
30 июля 2021, 00:30

В БД Postgresql есть таблица каталог

Мой запрос выдает мне вот такой результат

WITH RECURSIVE r as (
    SELECT id,pid,description
    from razdel
    union
    select razdel.id,razdel.pid,razdel.description
    from razdel
             join r on razdel.pid = r.id
)
select * from r;

Моя цель на выходе получить следующий результат.

Пока что написал такой скритп на PHP

<?php
$resultArr =  pg_fetch_all($data);
function Tree($array,$sub=null)
{
    foreach($array as $v)
    {
        if($v['pid']==$sub){
            echo  " ".$v['description'] . "\n";
            foreach($array as $twov){
                if(($v['id']==$twov['pid'])){
                  echo " ".$twov['description']. "\n";
                  Tree($array,$twov['id']);
                }
            }
        }
    }
}
echo "<pre>";
Tree($resultArr);

Он возвышает следующее.

А дальше даже не пойму что и как сделать. Жду ваших наставлений. С уважением emrdev/

Answer 1

Попробуйте так:

function Tree($array, $pid = 0) {
  if ($pid) {
      $haystack = array_filter($array, function ($item) use ($pid) {
        return (int)$item['pid'] === $pid;
      });
  }
  else {
    $haystack = $array;
  }
  if ($haystack) {
      echo '<div style="padding-left:15px;">';
  }
  foreach ($haystack as $item) {
    if ((int)$item['pid'] === $pid) {
          echo $item['description'];
          Tree($array, (int)$item['id']);
      }
  }
  if ($haystack) {
      echo '</div>';
  }
};
Tree($resultArr, 0);

Я не совсем уверен какой тип данных приходит к Вам в id и pid, поэтому на всякий выполнил приведение.

READ ALSO
Удаленный доступ к объектам в Android

Удаленный доступ к объектам в Android

Есть 2 приложенияОба приложения имеют определение интерфейса ICollback

132
Enter button Java

Enter button Java

Существует ли в Java регулярное выражение нажатие клавиши Enter как в python /r? Enter нужно отправить в консоль ssh, после выполнения команды

105
Можно ли использовать рекурсию?

Можно ли использовать рекурсию?

Есть задачаМетод принимает строку (длинную) и должен распечатать ее построчно так, чтобы длина каждой выводимой строки была не больше 13 символов...

384
Зафиксировать первую строку в listView

Зафиксировать первую строку в listView

Имеется listview который выводит n строк, нужно как-то сделать так, чтобы при прокрутке этого списка, первая его строка всегда была на виду, те

186