Поиск по этому блогу

пятница, 31 августа 2018 г.

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

Здравствуйте!

Хотелось бы поделиться очень хорошим примером рекурсии для php по самой распространённой задаче - сделать меню с категориями.

php, программирование, рекурсия,

Прежде всего создадим таблицу в базе данных.
CREATE  TABLE `categories` (
`id` INT  NOT NULL AUTO_INCREMENT ,
`parent_id`  INT NOT NULL ,
`name`  VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY  ( `id` )
);
Заполним её данными.
INSERT INTO `categories` (`id`, `parent_id`, `name`) VALUES
(1, 0, 'Раздел 1'),
(2, 0, 'Раздел 2'),
(3, 0, 'Раздел 3'),
(4, 1, 'Раздел 1.1'),
(5, 1, 'Раздел 1.2'),
(6, 4, 'Раздел 1.1.1'),
(7, 2, 'Раздел 2.1'),
(8, 2, 'Раздел 2.2'),
(9, 3, 'Раздел 3.1');
Создаём наш php файл для вывода и вытаскиваем данные из базы данных.
//Выбираем всё из нашей таблицы
$result=mysqli_query($connect, "SELECT * FROM  categories");
//Если в базе данных есть записи, формируем массив
if   (mysqli_num_rows($result) > 0){
    $cats = array();
//В цикле формируем массив разделов, ключом будет id родительской категории, а также массив разделов, ключом будет id категории
    while($cat =  mysqli_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);
На выходе получаем очень красивую структуру:
<ul>
    <li>Раздел 1
        <ul>
            <li>Раздел 1.1
                <ul>
                    <li>Раздел 1.1.1</li>
                </ul>
            </li>
            <li>Раздел 1.2</li>
        </ul>
    </li>
    <li>Раздел 2
        <ul>
            <li>Раздел 1.1</li>
            <li>Раздел 1.2</li>
        </ul>
    </li>
    <li>Раздел 3
        <ul>
            <li>Раздел 3.1</li>
        </ul>
    </li>
</ul>
Я считаю что это очень хороший пример рекурсии в php. Кроме того он решает столь распространённую задачу вывода меню или списка категорий.

Надеюсь код был полезен.
Успехов и хорошего дня!

Комментариев нет:

Отправить комментарий

Поделитесь своим мнением.