PHP:Как вывести дерево категорий?

129
27 февраля 2021, 20:50

наткнулся на статью хорошо описано про создания дерево категории, но функция вернет ответь в готовый html но я хочу получать дерево в массиве структура такая:

//Выбираем данные из БД
$result=mysql_query("SELECT * FROM  categories");
//Если в базе данных есть записи, формируем массив
if   (mysql_num_rows($result) > 0){
    $cats = array();
//В цикле формируем массив разделов, ключом будет id родительской категории, а также массив разделов, ключом будет id категории
    while($cat =  mysql_fetch_assoc($result)){
        $cats_ID[$cat['id']][] = $cat;
        $cats[$cat['parent_id']][$cat['id']] =  $cat;
    }
}
function build_tree($cats,$parent_id,$only_parent = false){
if(is_array($cats) and isset($cats[$parent_id])){
    $tree = '<ul>';
    if($only_parent==false){
        foreach($cats[$parent_id] as $cat){
            $tree .= '<li>'.$cat['name'].' #'.$cat['id'];
            $tree .=  build_tree($cats,$cat['id']);
            $tree .= '</li>';
        }
    }elseif(is_numeric($only_parent)){
        $cat = $cats[$parent_id][$only_parent];
        $tree .= '<li>'.$cat['name'].' #'.$cat['id'];
        $tree .=  build_tree($cats,$cat['id']);
        $tree .= '</li>';
    }
    $tree .= '</ul>';
}
else return null;
return $tree;
}
echo build_tree($cats,0);//результат в html

результат в виде html:

Вопрос: возможно ли получит дерево категории в виде массива не зависимо от вложенности

Answer 1

Вопрос: возможно ли получит дерево категории в виде массива не зависимо от вложенности ?

Отвечаю на этот вопрос во втором примере ! Хотя и первый тоже может понадобится.В моём коде он выводит категории в dropdown lists(<sleect><option>...).

=========================================================================

Примечание : mysql_fetch_assoc($result) вернёт вам вот такой массив:

$arr = [
    [
        'id' => 1,
        'parent_id' => 0,
        'name' => 'Раздел 1'
    ],
    [
        'id' => 2,
        'parent_id' => 0,
        'name' => 'Раздел 2'
    ],
    [
        'id' => 3,
        'parent_id' => 0,
        'name' => 'Раздел 3'
    ],
    [
        'id' => 4,
        'parent_id' => 1,
        'name' => 'Раздел 1.1'
    ],
    [
        'id' => 5,
        'parent_id' => 1,
        'name' => 'Раздел 1.2'
    ],
    [
        'id' => 6,
        'parent_id' => 4,
        'name' => 'Раздел 1.1.1'
    ],
    [
        'id' => 7,
        'parent_id' => 2,
        'name' => 'Раздел 2.1'
    ],
    [
        'id' => 8,
        'parent_id' => 2,
        'name' => 'Раздел 2.2'
    ],
    [
        'id' => 9,
        'parent_id' => 3,
        'name' => 'Раздел 3.1'
    ]
];

Дальнейшие примеры будут приведены исходя из данного массива $arr,который может иметь безграничную вложенность иерархий (id -> parent_id ).По крайней мере столько сколько позволено стеков в рекурсии.По моему равен 1000.

1.Результат: Одномерный массив указывающий глубину вложенности через черточку -:

function CreateTree($array,$sub=0,$tab='')
{
    //asort($array);
    $category=array();
    if($sub>0){$tab.='-';}
    foreach($array as $v){
        if($sub == $v['parent_id']){
            $category[$v['id']] = $tab.$v['name'];
            $category += CreateTree($array,$v['id'],$tab);
        }
    }
    return $category;
}
echo '<pre>';
print_r(CreateTree($arr));

2. Результат: Многомерный массив с иерархической вложенностью:

function CreateTree($array,$sub=0)
{
    $a = array();
    foreach($array as $v)
    {
        if($sub == $v['parent_id'])
        {
            $b = CreateTree($array,$v['id']);
            if(!empty($b))
            $a[$v['name']] = $b;
            else
            $a[$v['id']] = $v['name'];
        }
    }
    return $a;
}
echo "<pre>";
print_r(CreateTree($arr));
Answer 2

Вывод многоуровневого меню с неограниченным уровнем вложенности

https://webformyself.com/vyvod-mnogourovnevogo-menyu-s-neogranichennym-urovnem-vlozhennosti/

https://www.youtube.com/watch?v=EuBaxgzJzd8

Древовидная структура для вывода многоуровневого меню на php

https://webformyself.com/drevovidnaya-struktura-dlya-vyvoda-mnogourovnevogo-menyu-na-php/

https://www.youtube.com/watch?v=G0rHzDnwCdQ

READ ALSO
Использование hibernate несколькими приложениями

Использование hibernate несколькими приложениями

Сложилась такая ситуация, есть несколько отдельных приложений, которые используют одну базу данныхКонкретнее, есть приложение на vaadin'e и есть...

104
Как добавить заголовок Cache-Control к статическому ресурсу в Spring Boot?

Как добавить заголовок Cache-Control к статическому ресурсу в Spring Boot?

Как включить кэширование статических ресурсовЗнаю что можно добавить дерективу в application

129
Аналог функции Assembly.load из C# в Java

Аналог функции Assembly.load из C# в Java

В C# есть функция Assemblyload - запускающая сборку из массива байт

104
При компиляции проекта выдает ошибку:&ldquo;java.exe&rdquo; exited with code 3

При компиляции проекта выдает ошибку:“java.exe” exited with code 3

Я уже делал все возможные махинации с расположением jdk и в cmd у меня javac работает как должноВыдает вот это:

114