рекурсивно обхождане на категория

embaka

Registered
здравейте,

трябва ми рекурсивна функция за подаване на категория, като връща структуриран масив с всички подкатегории за категорията, която е подадена в нея
 
Ако си беше дал структурата на категориите, щеше да е по лесно но да приемем най - първичния вариант с parent_id, където parent_id = 0 е главната категория, а всяка подкатегория има parent_id с ИДто на предходната

PHP:
function generate_category_tree($parent_id = 0) {
$arr = array();
$sql = mysql_query('SELECT * FROM category WHERE parent_id="' . $parent_id . '"');

while($row = mysql_fetch_row($sql)) {
if(!empty($row)) {
$arr['id'] = $row['id'];
$arr['name'] = $row['name'];
$arr['sub_cats'] = generate_category_tree($row['id']);
}
return $arr;
}
}

Така ще направиш структура - дърво на всички категории. После вече можеш да си вземеш съответната категория със съответното ИД, която те интересува. Надявам се разбра принципа.
 
явно не си разбрал какво искам, идеята е като се подаде една категория да връща всичко структурирано в един масив на всички вътрешни категории. това което е написано ще върне последните категории от най вътрешната подкатегория а може и да не върне нищо защото няма проверка дали има записи
 
embaka каза:
явно не си разбрал какво искам, идеята е като се подаде една категория да връща всичко структурирано в един масив на всички вътрешни категории. това което е написано ще върне последните категории от най вътрешната подкатегория а може и да не върне нищо защото няма проверка дали има записи
Ако сортираш масива след това, няма ли да се получи това което желаеш ?
http://php.net/manual/en/function.sort.php

Или става дума за нещо подобно ! :
http://clubs.dir.bg/showflat.php?Board=php&Number=1942931562&page=12&view=collapsed&sb=1&vc=1
 
embaka каза:
явно не си разбрал какво искам, идеята е като се подаде една категория да връща всичко структурирано в един масив на всички вътрешни категории. това което е написано ще върне последните категории от най вътрешната подкатегория а може и да не върне нищо защото няма проверка дали има записи

Пробва ли го, преди да напишеш този коментар? Ще върне йерархична структура на всички категории в БДто, после много лесно можеш да си вземеш от масива каквото ти трябва подредено. И естествено че има проверка, ако не забелязваш.

В случай че не те удовлетворява напълно можеш да го модифицираш, ако трябва да добавиш още един параметър като ИД например, аз само ти показах принципа.
 
Radko каза:
embaka каза:
явно не си разбрал какво искам, идеята е като се подаде една категория да връща всичко структурирано в един масив на всички вътрешни категории. това което е написано ще върне последните категории от най вътрешната подкатегория а може и да не върне нищо защото няма проверка дали има записи

Пробва ли го, преди да напишеш този коментар? Ще върне йерархична структура на всички категории в БДто, после много лесно можеш да си вземеш от масива каквото ти трябва подредено. И естествено че има проверка, ако не забелязваш.

В случай че не те удовлетворява напълно можеш да го модифицираш, ако трябва да добавиш още един параметър като ИД например, аз само ти показах принципа.

ако последната заявка не върне резултат имаш проверка, да ама ретyрна ти е извън проверката което ще върне false, съответно ще се счупи, така че като ти кажа, че това не ми върши работа значи не ми върши, другото, което е че не трябва да взема един запис защото в подкатегорията може да има 20 подкатегории а не 1
 
Дай примерна структура на таблиците ти да видя как запазваш подкатегориите на категориите и съответно подподкатегориите на подкатегориите и т.н. Разбра ме :D
 
embaka каза:
Radko каза:
embaka каза:
явно не си разбрал какво искам, идеята е като се подаде една категория да връща всичко структурирано в един масив на всички вътрешни категории. това което е написано ще върне последните категории от най вътрешната подкатегория а може и да не върне нищо защото няма проверка дали има записи

Пробва ли го, преди да напишеш този коментар? Ще върне йерархична структура на всички категории в БДто, после много лесно можеш да си вземеш от масива каквото ти трябва подредено. И естествено че има проверка, ако не забелязваш.

В случай че не те удовлетворява напълно можеш да го модифицираш, ако трябва да добавиш още един параметър като ИД например, аз само ти показах принципа.

ако последната заявка не върне резултат имаш проверка, да ама ретyрна ти е извън проверката което ще върне false, съответно ще се счупи, така че като ти кажа, че това не ми върши работа значи не ми върши, другото, което е че не трябва да взема един запис защото в подкатегорията може да има 20 подкатегории а не 1

Всичко работи както трябва, нищо няма да се счупи, явно така и така не си го пробвал. Ретърна е след цикъла, защото ако ретърнеш в него, нали ще спре изпълнението му? И няма да върне false ако няма резултати, ще върне празен масив, тоест че няма подкатегории.

Ето на мен при един прост тест какво ми връща, и доколкото ти чета постовете е точно това от което имаш нужда (пормених имената на полетата да не правя големи таблици има само title поле и parent_id):

PHP:
Array
(
    [0] => Array
        (
            [title] => cat1
            [subcats] => Array
                (
                    [0] => Array
                        (
                            [title] => subcat_cat1
                            [subcats] => Array
                                (
                                    [0] => Array
                                        (
                                            [title] => sub_sub_cat1
                                            [subcats] => Array
                                                (
                                                )

                                        )

                                )

                        )

                )

        )

    [1] => Array
        (
            [title] => cat2
            [subcats] => Array
                (
                )

        )

    [2] => Array
        (
            [title] => cat3
            [subcats] => Array
                (
                    [0] => Array
                        (
                            [title] => subcat_cat3
                            [subcats] => Array
                                (
                                )

                        )

                )

        )

    [3] => Array
        (
            [title] => cat4
            [subcats] => Array
                (
                )

        )

    [4] => Array
        (
            [title] => cat5
            [subcats] => Array
                (
                    [0] => Array
                        (
                            [title] => subcat_cat5
                            [subcats] => Array
                                (
                                )

                        )

                )

        )

    [5] => Array
        (
            [title] => cat6
            [subcats] => Array
                (
                )

        )

    [6] => Array
        (
            [title] => cat7
            [subcats] => Array
                (
                )

        )

    [7] => Array
        (
            [title] => cat8
            [subcats] => Array
                (
                )

        )

)

Но като си казал че не ти върши работа и толкова не можеш да си го модифицираш, така че да ти върши нуждите, няма какво повече да се занимавам. Успех.
 
PHP:
<?php 

function structure_cat($category_id)
{
       $category; //here will be stored the data for the category
        $category = get_cat_data($category_id);  // here we get all the information for a particular category
       $query = 'SELECT category_id FROM categories WHERE parent_category = ' . $category->category_id;
      
       if (mysql_num_rows($query) > 0)
      {
         $category->children = array();
         foreach (mysql_fetch_array($query) as $child_id)
         {
                $category->children[] =  structure_cat($child_id);
          }
       }
         return $category;
}
function get_cat_data($category_id)
{
      $category;
      $query = 'SELECT * FROM categories WHERE category_id = ' . $category_id . ' LIMIT 1';
      $category = mysql_fetch_object($query);
       return $category;
}

Ето ти рекурсивна функция с взимане на информацията от MySQL база данни. Виж документацията за mysql_fetch_array и mysql_num_rows, защото не съм сигурен дали ги ползвам по необходимия начин.
 

Горе