Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Составление массива для рекурсивного вывода дерева
 
 автор: Денис   (23.01.2007 в 17:05)   письмо автору
 
 

Тема избита, но решить не получается уже второй день.
В базе имеется id, id_parent.
10 - 1
11 - 10
12 - 10
13 - 12
14 - 12
Необходимо составить массив и вывести в виде дерева.
Вариант 1.

$sSQL = "SELECT * FROM ". $this->_table_assembly_activity;
            if($chapter_id) {
                    $sSQL .= " WHERE CHAPTER_ID = ".$chapter_id;    
            }
            if($parent_id != null) {
                    $sSQL .= " AND PARENT_ASSEMBLY_ACTIVITY_ID = ".$parent_id;    
            }
            $res = mysql_query($sSQL);
            if(mysql_num_rows($res) > 0)
            {
              $i = 0;
              while($fetch = mysql_fetch_array($res))
              {
                $arrObjActivitySub[$i]["activity_id"] = $fetch['ASSEMBLY_ACTIVITY_ID'];
                $arrObjActivitySub[$i]["activity__parent_id"] = $fetch['PARENT_ASSEMBLY_ACTIVITY_ID'];
                $i++;
              }
              for($i = 0; $i < count($arrObjActivitySub); $i++) {
                          
              }
            }
            return $arrObjActivitySub;

вывод:

Array ( [0] => Array ( [activity_id] => 10 [activity__parent_id] => 1 ) )


Вариант 2


            $table = $this->_table_assembly_activity;        
            $sSQL = "SELECT * FROM ". $table;
            if($chapter_id) {
                    $sSQL .= " WHERE CHAPTER_ID = ".$chapter_id;    
            }
            if($parent_id) {
                    $sSQL .= " AND PARENT_ASSEMBLY_ACTIVITY_ID = ".$parent_id;    
            }
            $res = mysql_query($sSQL);
            
            $objActivity = mysql_fetch_assoc($res);
            
            if(!$objActivityRow && ($activity_id != 1))
            {
                return null;
            }
            $formdata = array(
                                "assemply_activity_id"                    =>     $objActivity["ASSEMBLY_ACTIVITY_ID"],
                                "parent_assemply_activity_id"            =>     $objActivity["PARENT_ASSEMBLY_ACTIVITY_ID"],
                                "assemply_activity_id_customer_edit"    =>     $objActivity["PARENT_ASSEMBLY_ACTIVITY_ID_CUSTOMER_EDIT"],
                                "activity_sequence"                     =>     $objActivity["ACTIVITY_SEQUENCE"],
                                "activity_sequence_customer_edit"         =>     $objActivity["ACTIVITY_SEQUENCE_CUSTOMER_EDIT"],
                                "description"                             =>     $objActivity["DESCRIPTION"],
                                "description_customer_edit"             =>     $objActivity["DESCTIPTION_CUSTOMER_EDIT"],
                                "hint_description"                         =>     $objActivity["HINT_DESCRIPTION"],
                                "hint_description_customer_edit"         =>     $objActivity["HINT_DESCTIPTION_CUSTOMER_EDIT"],
                                "encoded_viewpoint_name"                 =>     $objActivity["ENCODED_VIEWPOINT_NAME"],
                                "name"                                     =>     $objActivity["NAME"],
                                "name_customer_edit"                     =>     $objActivity["NAME_CUSTOMER_EDIT"],
                                "chapter_id"                             =>     $objActivity["CHAPTER_ID"],
                                "notes"                                 =>     $objActivity["NOTES"]
                    );
            
            $Activity = new Activity($formdata);

            $Activity->assemply_activity_id = $activity_id;            
            $sSQL2 = "SELECT * FROM ". $table;
            if($chapter_id) {
                    $sSQL2 .= " WHERE CHAPTER_ID = ".$chapter_id;    
            }
            $sSQL2 .= " AND PARENT_ASSEMBLY_ACTIVITY_ID = ".$Activity->assemply_activity_id;    
            
            $res2 = mysql_query($sSQL2);
            $objActivitySubs = mysql_fetch_array($res2);
            if(!$res2)
            {
                return $Activity; 
            }
            foreach($objActivitySubs as $row)
            {    
                $objActivity = $this->getCategoryWithSubs(1, $row["ASSEMBLY_ACTIVITY_ID"]);
                
                $Activity->subactives[] = $objActivity;
            }
            return $Activity;


Вывод зацикливается и безрезультатно.

   
 
 автор: Trianon   (23.01.2007 в 17:47)   письмо автору
 
   для: Денис   (23.01.2007 в 17:05)
 

что-то рекурсии у Вас не наблюдается...

   
 
 автор: Денис   (24.01.2007 в 19:28)   письмо автору
 
   для: Trianon   (23.01.2007 в 17:47)
 

Нашел ответ на свой вопрос. Данные выбираются, но есть один недочет. Данные составляются в массив такого вида:
Array
(
[0] => Array
(
[CHAPTER_ID] => 1
[CHAPTER_NAME] => Testing Activity Data Set
[descr] => Active 1
[activeID] => 18
[activeParentID] => 1
[level] => 0
)

[1] => Array
(
[CHAPTER_ID] => 1
[CHAPTER_NAME] => Testing Activity Data Set
[descr] => Active 2
[activeID] => 19
[activeParentID] => 18
[level] => 1
)
[2] => Array
(
[CHAPTER_ID] => 1
[CHAPTER_NAME] => Testing Activity Data Set
[descr] => Active 4
[activeID] => 21
[activeParentID] => 19
[level] => 2
)
...........
Т.е. упорядоченного вида. Я же хотел, чтобы массив имел вложенность, т.е. например Array([10] => Array([0] => 18) [1] => Array([0] => 11 [1] => 12 [2] => 3) [11] => Array([0] => 21)). Ниже пример скрипта. Подскажите, как его видоизменить, чтобы получить массив нужного вида?

function CatList($chapter_id, $activity_id, $level)
        {
            $table = $this->_table_assembly_activity;
            $sSQL = "SELECT 
                            tc.CHAPTER_ID, tc.CHAPTER_NAME, 
                            ta.DESCRIPTION descr, ta.ASSEMBLY_ACTIVITY_ID as activeID, ta.PARENT_ASSEMBLY_ACTIVITY_ID as activeParentID 
                        FROM ". $table." ta, 
                            ".$this->_table_chapter." tc";
            if($chapter_id) {
                    $sSQL .= " WHERE ta.CHAPTER_ID = tc.CHAPTER_ID AND ta.CHAPTER_ID = ".$chapter_id;    
            }
            if($activity_id) {
                $sSQL .= " AND ta.PARENT_ASSEMBLY_ACTIVITY_ID = ".$activity_id;
            }

           $a = array();
           $res = mysql_query($sSQL);
           while ($row = mysql_fetch_assoc($res) )
           {
              $row['level'] = $level;
              $a[] = $row;
              $b = $this->CatList(1, $row['activeID'],$level+1);
              for ($j=0; $j<count($b); $j++)
              {
                  $a[] = $b[$j];
              }
           }
           return $a;
        }

Заранее благодарен. С уважением, Денис

   
 
 автор: Денис   (24.01.2007 в 19:28)   письмо автору
 
   для: Trianon   (23.01.2007 в 17:47)
 

Нашел ответ на свой вопрос. Данные выбираются, но есть один недочет. Данные составляются в массив такого вида:
Array
(
[0] => Array
(
[CHAPTER_ID] => 1
[CHAPTER_NAME] => Testing Activity Data Set
[descr] => Active 1
[activeID] => 18
[activeParentID] => 1
[level] => 0
)

[1] => Array
(
[CHAPTER_ID] => 1
[CHAPTER_NAME] => Testing Activity Data Set
[descr] => Active 2
[activeID] => 19
[activeParentID] => 18
[level] => 1
)
[2] => Array
(
[CHAPTER_ID] => 1
[CHAPTER_NAME] => Testing Activity Data Set
[descr] => Active 4
[activeID] => 21
[activeParentID] => 19
[level] => 2
)
...........
Т.е. упорядоченного вида. Я же хотел, чтобы массив имел вложенность, т.е. например Array([10] => Array([0] => 18) [1] => Array([0] => 11 [1] => 12 [2] => 3) [11] => Array([0] => 21)). Ниже пример скрипта. Подскажите, как его видоизменить, чтобы получить массив нужного вида?

function CatList($chapter_id, $activity_id, $level)
        {
            $table = $this->_table_assembly_activity;
            $sSQL = "SELECT 
                            tc.CHAPTER_ID, tc.CHAPTER_NAME, 
                            ta.DESCRIPTION descr, ta.ASSEMBLY_ACTIVITY_ID as activeID, ta.PARENT_ASSEMBLY_ACTIVITY_ID as activeParentID 
                        FROM ". $table." ta, 
                            ".$this->_table_chapter." tc";
            if($chapter_id) {
                    $sSQL .= " WHERE ta.CHAPTER_ID = tc.CHAPTER_ID AND ta.CHAPTER_ID = ".$chapter_id;    
            }
            if($activity_id) {
                $sSQL .= " AND ta.PARENT_ASSEMBLY_ACTIVITY_ID = ".$activity_id;
            }

           $a = array();
           $res = mysql_query($sSQL);
           while ($row = mysql_fetch_assoc($res) )
           {
              $row['level'] = $level;
              $a[] = $row;
              $b = $this->CatList(1, $row['activeID'],$level+1);
              for ($j=0; $j<count($b); $j++)
              {
                  $a[] = $b[$j];
              }
           }
           return $a;
        }

Заранее благодарен. С уважением, Денис

   
 
 автор: bronenos   (24.01.2007 в 23:29)   письмо автору
 
   для: Денис   (24.01.2007 в 19:28)
 

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

   
 
 автор: Денис   (25.01.2007 в 11:49)   письмо автору
 
   для: bronenos   (24.01.2007 в 23:29)
 

Пример того, что у меня получилось:

rray
(
[0] => Array
(
[CHAPTER_ID] => 1
[CHAPTER_NAME] => Testing Activity Data Set
[descr] => Active 1
[activeID] => 18
[activeParentID] => 1
[level] => 0
)

[1] => Array
(
[CHAPTER_ID] => 1
[CHAPTER_NAME] => Testing Activity Data Set
[descr] => Active 2
[activeID] => 19
[activeParentID] => 18
[level] => 1
)
[2] => Array
(
[CHAPTER_ID] => 1
[CHAPTER_NAME] => Testing Activity Data Set
[descr] => Active 4
[activeID] => 21
[activeParentID] => 19
[level] => 2
)


Пример того, что хотел получить%

Array
(
    [--menu1] => 1
    [--menu2] => Array
        (
            [----menu2.1] => 1
            [----menu2.2] => Array
                (
                    [------menu2.2.1] => 1
                    [------menu2.2.2] => 1
                    [------menu2.2.3] => 1
                )

            [----menu2.3] => 1
            [----menu2.4] => 1
        )

    [--menu3] => 1
    [--menu4] => 1
)

Заранее спасибо.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования