Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
xew
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 6
1

Категории бесконечной вложенности (Вывод определенной родительской категории с дочерними)

21.01.2014, 08:30. Просмотров 3421. Ответов 7
Метки нет (Все метки)

Имеется SQL база категорий вида (id,name,subcategory) - Если subcategory=0 то это родительская категория

Создание массива:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function get_cat() 
{
    //запрос к базе данных
    $sql = "SELECT * FROM category";
    $result = mysql_query($sql);
    if(!$result) 
    {
        return NULL;
    }
    $arr_cat = array();
    if(mysql_num_rows($result) != 0) 
    {
        //В цикле формируем массив
        for($i = 0; $i < mysql_num_rows($result);$i++) 
        {
            $row = mysql_fetch_array($result,MYSQL_ASSOC);
            
            //Формируем массив, где ключами являются адишники на родительские категории
            if(empty($arr_cat[$row['subcategory']])) 
            {
                $arr_cat[$row['subcategory']] = array();
            }
            $arr_cat[$row['subcategory']][] = $row;
        }
        //возвращаем массив
        return $arr_cats;
    }
}
Вывод категорий:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function view_cat($arr,$subcategory = 0) 
{
    //Условия выхода из рекурсии
    if(empty($arr[$subcategory])) {
        return;
    }
    echo "<ul>";
    //перебираем в цикле массив и выводим на экран
    for ($i = 0; $i < count($arr[$subcategory]);$i++) 
    {
        echo "<li><a href='index.php?main_category".$_GET["main_category"]."&category=".$arr[$subcategory][$i]["id"].
                    "&subcategory=".$subcategory."'>"
                    .$arr[$subcategory][$i]["name"]."</a>";
        //рекурсия - проверяем нет ли дочерних категорий
        view_cat($arr,$arr[$subcategory][$i]["id"]);
        echo "</li>";
    }
    echo "</ul>";
}
Ни как не могу понять как вывести только одну родительскую категорию со всеми в неё вложеными подкатегориями
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2014, 08:30
Ответы с готовыми решениями:

Статистика у родительской категории (с учетом вложенных)
Подскажите, пожалуста, с MySQL. Уж очень плохо это дело знаю. Нужно сделать...

Получение записей, которые принадлежать к определенной категории
Здравствуйте. Есть таблица: 'product_to_category', и его колонки: 'product_id',...

Select [Категории] и [под категории]
Доброго времени суток ув. форумчане. Столкнулся с большой задачей, которую...

Парсинг новых обьявлений из определенной категории сайта
Есть категория с обьявлениями : https://999.md/category/real-estate Задача:...

Вывод статьи по категории
Всем привет, в php недавно, написал (вернее списал, переделал) банальный...

7
piminov
36 / 36 / 8
Регистрация: 04.11.2013
Сообщений: 117
21.01.2014, 13:03 2
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function get_cat($id) {
    if (strval(intval($id)) !== strval($id))
        return NULL;
 
    //запрос к базе данных
    if (!mysql_query("SELECT * FROM category WHERE category=$id"));
        return NULL;
 
    $arr_cat = array();
    if(mysql_num_rows($result) != 0) {
        //В цикле формируем массив
        for($i = 0; $i < mysql_num_rows($result); $i++) {
            $row = mysql_fetch_array($result,MYSQL_ASSOC);
            
            //Формируем массив, где ключами являются адишники на родительские категории
            if(empty($arr_cat[$row['subcategory']])) 
                $arr_cat[$row['subcategory']] = array();
 
            $arr_cat[$row['subcategory']][] = $row;
        }
        //возвращаем массив
        return $arr_cats;
    }
}
0
xew
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 6
21.01.2014, 14:24  [ТС] 3
Цитата Сообщение от piminov Посмотреть сообщение
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function get_cat($id) {
    if (strval(intval($id)) !== strval($id))
        return NULL;
 
    //запрос к базе данных
    if (!mysql_query("SELECT * FROM category WHERE subcategory=$id"));
        return NULL;
 
    $arr_cat = array();
    if(mysql_num_rows($result) != 0) {
        //В цикле формируем массив
        for($i = 0; $i < mysql_num_rows($result); $i++) {
            $row = mysql_fetch_array($result,MYSQL_ASSOC);
            
            //Формируем массив, где ключами являются адишники на родительские категории
            if(empty($arr_cat[$row['subcategory']])) 
                $arr_cat[$row['subcategory']] = array();
 
            $arr_cat[$row['subcategory']][] = $row;
        }
        //возвращаем массив
        return $arr_cat;
    }
}
Ничего не выводит, не особо понял логику что вы сделали если можно поясните... в запрос и сам добавлял id подкатегории но мне нужна вся ветвь этого корня о_О а так выведет только одну или несколько записей
0
piminov
36 / 36 / 8
Регистрация: 04.11.2013
Сообщений: 117
21.01.2014, 15:33 4
Да, посмотрел код повнимательнее, надо по другому, например так можно.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
function get_cat_list() {
    $result = mysql_query("SELECT * FROM category");
    if (!$result && mysql_num_rows($result) != 0)
        return null;
 
    $list = array();
 
    while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
        $list[$row['id']] = $row;
 
    return $list;
}
 
function get_cat_tree($list) {
    $tree = array();
 
    foreach ($list as $id => $row)
        $tree[$row['subcategory']][] = $id;
 
    return $tree;
}
 
 
function view_cat($list, $tree, $id = 0) {
    if ($id != 0 && !array_key_exists($id, $list))
        return;
 
    if ($id != 0) {
        echo "<li><a href='index.php?main_category".$_GET["main_category"]."&category=".$id.
                    "&subcategory=".$list[$id]['subcategory']."'>"
                    .$list[$id]["name"]."</a>";
    }
 
    if (array_key_exists($id, $tree)) {
        echo "<ul>";
        foreach ($tree[$id] as $sub_id)
            view_cat($list, $tree, $sub_id);
        echo "</ul>";
    }
 
    if ($id != 0) echo "</li>";
}
 
$list = get_cat_list();
$tree = get_cat_tree($list);
view_cat($list, $tree, $id_категории_которую_нужно_напечатать);
1
xew
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 6
21.01.2014, 15:59  [ТС] 5
Цитата Сообщение от piminov Посмотреть сообщение
Да, посмотрел код повнимательнее, надо по другому, например так можно.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
function get_cat_list() {
    $result = mysql_query("SELECT * FROM category");
    if (!$result && mysql_num_rows($result) != 0)
        return null;
 
    $list = array();
 
    while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
        $list[$row['id']] = $row;
 
    return $list;
}
 
function get_cat_tree($list) {
    $tree = array();
 
    foreach ($list as $id => $row)
        $tree[$row['subcategory']][] = $id;
 
    return $tree;
}
 
 
function view_cat($list, $tree, $id = 0) {
    if ($id != 0 && !array_key_exists($id, $list))
        return;
 
    if ($id != 0) {
        echo "<li><a href='index.php?main_category".$_GET["main_category"]."&category=".$id.
                    "&subcategory=".$list[$id]['subcategory']."'>"
                    .$list[$id]["name"]."</a>";
    }
 
    if (array_key_exists($id, $tree)) {
        echo "<ul>";
        foreach ($tree[$id] as $sub_id)
            view_cat($list, $tree, $sub_id);
        echo "</ul>";
    }
 
    if ($id != 0) echo "</li>";
}
 
$list = get_cat_list();
$tree = get_cat_tree($list);
view_cat($list, $tree, $id_категории_которую_нужно_напечатать);
Огромное спасибо а то уже думал использовать Nested Sets а у меня база с категориями на 3000 строк о_О
0
xew
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 6
25.01.2014, 11:26  [ТС] 6
Не подскажите как зная id и родителя. Узнать уровень вложенности категории ?

К примеру

0 - Все категории
1 - Техника
1 - Электоника
2 - Фен
и т.д.
0
piminov
36 / 36 / 8
Регистрация: 04.11.2013
Сообщений: 117
25.01.2014, 12:38 7
Ну, например используя предыдущий код

PHP
1
2
3
4
5
6
7
8
9
10
function get_cat_level($list, $id = 0) {
    $level = 0;
 
    while ($id != 0) {
        $id = $list[$id]->subcategory;
        $level++;
    }
 
    return $level++;
}
1
xew
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 6
25.01.2014, 16:45  [ТС] 8
Цитата Сообщение от piminov Посмотреть сообщение
Ну, например используя предыдущий код

PHP
1
2
3
4
5
6
7
8
9
10
function get_cat_level($list, $id = 0) {
    $level = 0;
 
    while ($id != 0) {
        $id = $list[$id]->subcategory;
        $level++;
    }
 
    return $level++;
}
Я так сделал спасибо Все же перешел на Nested Sets, гораздо удобнее )

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?
 
require_once ("dbconfig.php");
 
function getCategory() {
    $query = mysql_query("SELECT * FROM category");
    $result = array();
    while ($row = mysql_fetch_array($query)) {
        $result[$row["subcategory"]][] = $row;
    }
    return $result;
}
 
$category_arr = getCategory();
 
function outTree($parent_id, $level) {
    global $category_arr; //Делаем переменную $category_arr видимой в функции
    if (isset($category_arr[$parent_id])) { //Если категория с таким parent_id существует
        foreach ($category_arr[$parent_id] as $value) { //Обходим
            /**
             * Выводим категорию 
             *  $level * 25 - отступ, $level - хранит текущий уровень вложености (0,1,2..)
             */
            echo "<div style=\"margin-left:" . ($level * 25) . "px;\">id: ".$value["id"]." name: ".$value["name"]." level: ".$level."</div>";
            mysql_query("update category set level=".$level." where id=".$value["id"]); 
      
            $level = $level + 1; //Увеличиваем уровень вложености
            //Рекурсивно вызываем эту же функцию, но с новым $parent_id и $level
            outTree($value["id"], $level);
            $level = $level - 1; //Уменьшаем уровень вложености
        }
    }
}
 
outTree(0, 0);
 
?>
Добавлено через 4 часа 5 минут
Все бы хорошо с Nested Sets но что то не могу понять как по Уровню вложенности сделать <ul> <li> </li> </ul> у меня просто с базы берет базу запросом
SQL
1
"SELECT * FROM category WHERE i_left >= (SELECT i_left FROM category WHERE id=$id) AND i_right <= (SELECT i_right FROM category WHERE id=$id) ORDER BY i_left
PHP
1
2
3
4
5
6
do
{
    $level = $db_fetch_category["level"];
    echo "<li><a href='index.php?category=".$db_fetch_category["id"]."' style='margin-left: ".$n."px;'>".$db_fetch_category["name"]."</a></li>";
}
while ($db_fetch_category = mysql_fetch_array ($db_category));
0
25.01.2014, 16:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2014, 16:45

Не могу реализовать вывод категории(
$result2 = mysql_query(&quot;SELECT * FROM data ORDER BY id DESC LIMIT $start,...

вывод родительсвкой категории в хлебных крошках
добрый день всем! очень нужна подсказка в следующем вопросе. в бд одна...

Категории
Доброго времени суток, помогите кто может, вывожу на главной посты с мини все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru