Форумы портала PHP.SU » » Работа с СУБД » пометить дерево sql - запроса в многомерный массив

Страниц (2): [1] 2 »
 

1. jonston - 08 Мая, 2011 - 21:15:47 - перейти к сообщению
Всем привет!Вопрос такой:
Есть таблица базы данных:

Нажмите для увеличения

Если кто заметил категории связываются ключом parent_id.Категории могут быть бесконечной вложенности.
Вывести дерево категорий у меня получилось.А вот как мне занести все это дело в многомерный массив?Чтобы примерно получилось вот так:
PHP:
скопировать код в буфер обмена
  1.  
  2.         $cat_data = array
  3.             (
  4.                 0 => array
  5.                     (
  6.                         'id' => 1,
  7.                         'name' => 'категория',
  8.                         'parent_id' => 0
  9.                     ),
  10.                 1 => array
  11.                     (
  12.                         'id' => 2,
  13.                         'name' => 'категория2',
  14.                         'parent_id' => 0,
  15.                         3 => array
  16.                             (
  17.                                 'id' => 4,
  18.                                 'name' => 'категория2_1',
  19.                                 'parent_id' => 2
  20.                             ),
  21.                         4 => array
  22.                             (
  23.                                 'id' => 5,
  24.                                 'name' => 'категория2_2',
  25.                                 'parent_id' => 2,
  26.                                 3 => array
  27.                                     (
  28.                                         'id' => 6,
  29.                                         'name' => 'категория2_2_1',
  30.                                         'parent_id' => 5,
  31.                                         3 => array
  32.                                             (
  33.                                                 'id' => 7,
  34.                                                 'name' => 'категория2_2_1_1',
  35.                                                 'parent_id' => 6,
  36.                                             ),
  37.                                         4 => array
  38.                                             (
  39.                                                 'id' => 8,
  40.                                                 'name' => 'категория2_2_1_2',
  41.                                                 'parent_id' => 6,
  42.                                             ),
  43.                                         5 => array
  44.                                             (
  45.                                                 'id' => 9,
  46.                                                 'name' => 'категория2_2_1_3',
  47.                                                 'parent_id' => 6,
  48.                                             ),
  49.                                     ),
  50.                             ),
  51.                     ),
  52.                 3 => array
  53.                     (
  54.                         'id' => 11,
  55.                         'name' => 'категория3',
  56.                         'parent_id' => 0,                    
  57.                     ),
  58.             );
  59.  

Если допустил ошибку при написании массива, простите!Спасибо!Всех с наступающим днем победы!
2. Haron - 08 Мая, 2011 - 21:26:37 - перейти к сообщению
Покажи чем дерево выводишь.
3. jonston - 08 Мая, 2011 - 21:47:13 - перейти к сообщению
Haron пишет:
Покажи чем дерево выводишь.

PHP:
скопировать код в буфер обмена
  1.  
  2.     function help_tree_display($elem_id)
  3.     {
  4.         $sql = "SELECT * FROM categories WHERE parent_id = ".$elem_id;
  5.         $query = $this->db->query($sql);
  6.         $result = $query->result_array();
  7.        
  8.         if($query->num_rows() > 0)
  9.         {
  10.             return $result;
  11.         }
  12.         else return false;
  13.     }
  14.  
  15.     function tree_display($elem_id)
  16.     {
  17.         if( ! is_array($elem_id)) $arr_elem = $this->help_tree_display($elem_id);
  18.         else $arr_elem = $elem_id;
  19.         if($arr_elem)
  20.         {
  21.             echo '<ul>';
  22.             foreach($arr_elem as $row)
  23.             {
  24.                 echo '<li>';
  25.                 echo '<a href="'.base_url().'goods/showing_tree/'.$row['id'].'">'.$row['name'].'</a>';
  26.                 echo '</li>';
  27.                
  28.                 $sql = "SELECT * FROM categories WHERE parent_id = ".$row['id'];
  29.                 $query = $this->db->query($sql);
  30.                 $result = $query->result_array();
  31.                
  32.                 if($query->num_rows() > 0)$this->tree_display($result);
  33.             }
  34.             echo '</ul>';
  35.         }
  36.         else
  37.         {
  38.             $sql = "SELECT * FROM categories WHERE id = ".$elem_id;
  39.             $query = $this->db->query($sql);
  40.             $result = $query->row_array();
  41.                        
  42.             echo '<li>';
  43.             echo $result['name'];
  44.             echo '</li>';        
  45.         }
  46.     }
  47.  

(Добавление)
вопрос так и не решен.
(Добавление)
Что ответа не ждать я так понял?
4. Mr.KreDo - 08 Мая, 2011 - 23:14:00 - перейти к сообщению
jonston пишет:
(Добавление)
вопрос так и не решен.
(Добавление)
Что ответа не ждать я так понял?


вы бы написали еще в 02:30 ночи Не понял

( не чего личного )
5. jonston - 08 Мая, 2011 - 23:21:35 - перейти к сообщению
Mr.KreDo пишет:
jonston пишет:
(Добавление)
вопрос так и не решен.
(Добавление)
Что ответа не ждать я так понял?


вы бы написали еще в 02:30 ночи Не понял

( не чего личного )


ты же в это время здесь?))
6. Mr.KreDo - 08 Мая, 2011 - 23:29:00 - перейти к сообщению
jonston пишет:
ты же в это время здесь?))


я самоучка, помочь не смогу...
7. jonston - 09 Мая, 2011 - 11:51:06 - перейти к сообщению
Что никто не знает ответа?Да я думал здесь реальные спецы!
8. komprenda - 09 Мая, 2011 - 12:02:00 - перейти к сообщению
jonston пишет:
Что никто не знает ответа?Да я думал здесь реальные спецы!


выбираешь всё из базы в $arr а затем с помощью рекурсивной функции выводишь. Пробуй-эксперементируй.
9. jonston - 09 Мая, 2011 - 12:07:59 - перейти к сообщению
обрати внимание что я написал вверху рекурсивную функцию и к ней вспомогательную.Они выводят дерево категорий.Вопрос стоит что бы не выводить а занести данные в массив для дальнейшей передачи их в вид.
Но все равно спасибо за ответ!
10. komprenda - 09 Мая, 2011 - 12:12:11 - перейти к сообщению
jonston пишет:
обрати внимание что я написал вверху рекурсивную функцию и к ней вспомогательную.Они выводят дерево категорий.Вопрос стоит что бы не выводить а занести данные в массив для дальнейшей передачи их в вид.
Но все равно спасибо за ответ!


у тебя в ней 1000 и 1 выборка из базы лучше выбрать всё сразу
11. jonston - 09 Мая, 2011 - 12:19:00 - перейти к сообщению
Да я в курсе что в плане оптимизации запроса далеко не самый лучший вариант.
Вопрос состоит не в этом.Вопрос состоит в том как использовать рекурсию чтобы правильно создать массив данных.
12. Мелкий - 09 Мая, 2011 - 12:28:18 - перейти к сообщению
jonston пишет:
Вопрос состоит в том как использовать рекурсию чтобы правильно создать массив данных.

А зачем рекурсия-то?
Выбираете из таблицы все строки и загоняете в двухмерный массив:
PHP:
скопировать код в буфер обмена
  1. $q = mysql_query('/**/');
  2. $arr = array();
  3. while($row = mysql_fetch_assoc($q)) {
  4. if ( ! isset($arr[ $row['parent'] ])) $arr[ $row['parent'] ] = array();
  5. $arr[ $row['parent'] ][] = $row;
  6. }
13. jonston - 09 Мая, 2011 - 12:31:49 - перейти к сообщению
Мелкий, спасибо!Сейчас попробую!Скажи когда я смогу говорить "спасибо"?
(Добавление)
Мелкий, отчасти ты решил проблему!Вот что получилось:
PHP:
скопировать код в буфер обмена
  1.  
  2. (
  3.     [0] => Array
  4.         (
  5.             [0] => Array
  6.                 (
  7.                     [id] => 1
  8.                     [parent_id] => 0
  9.                     [name] => категория1
  10.                 )
  11.  
  12.             [1] => Array
  13.                 (
  14.                     [id] => 2
  15.                     [parent_id] => 0
  16.                     [name] => категория2
  17.                 )
  18.  
  19.             [2] => Array
  20.                 (
  21.                     [id] => 11
  22.                     [parent_id] => 0
  23.                     [name] => категория3
  24.                 )
  25.  
  26.         )
  27.  
  28.     [6] => Array
  29.         (
  30.             [0] => Array
  31.                 (
  32.                     [id] => 7
  33.                     [parent_id] => 6
  34.                     [name] => категория2_2_1_1
  35.                 )
  36.  
  37.             [1] => Array
  38.                 (
  39.                     [id] => 8
  40.                     [parent_id] => 6
  41.                     [name] => категория2_2_1_2
  42.                 )
  43.  
  44.             [2] => Array
  45.                 (
  46.                     [id] => 9
  47.                     [parent_id] => 6
  48.                     [name] => категория2_2_1_3
  49.                 )
  50.  
  51.         )
  52.  
  53.     [2] => Array
  54.         (
  55.             [0] => Array
  56.                 (
  57.                     [id] => 4
  58.                     [parent_id] => 2
  59.                     [name] => категория2_1
  60.                 )
  61.  
  62.             [1] => Array
  63.                 (
  64.                     [id] => 5
  65.                     [parent_id] => 2
  66.                     [name] => категория2_2
  67.                 )
  68.  
  69.         )
  70.  
  71.     [5] => Array
  72.         (
  73.             [0] => Array
  74.                 (
  75.                     [id] => 6
  76.                     [parent_id] => 5
  77.                     [name] => категория2_2_1
  78.                 )
  79.  
  80.         )
  81.  
  82. )
  83.  

Получился двухмерный массив.А нужен многомерный массив с неограниченной вложенностью.Как это решить без рекурсии?Заранее благодарю!
P.S. Массив который должен получится смотри вверху этого топика.
14. EuGen - 09 Мая, 2011 - 14:21:25 - перейти к сообщению
jonston пишет:
Как это решить без рекурсии?

Без рекурсии у Вас не получится. Вам же нужна неограниченная вложенность.
Вообще древовидные струкруры в реляционной БД строятся "плохо" - то есть Вам приходится в любом случае делать запрос за запросом.
Иными словами:
0. Делаете запрос на выборку из таблицы, где parent_id=0
1. Пробегаетесь по строкам
2. Делаете запрос на выборку из таблицы, где parent_id=значению в текущей строке.
Для организации рекурсии нужно объединить запрос на выборку и перебор строк в одну функцию, принимающаю параметр id (это parent_id, по которому функция сделает выборку) и возвращающая все строки, у которых parent_id = переданному этой функции id.
15. jonston - 09 Мая, 2011 - 14:37:04 - перейти к сообщению
Спасибо!Посмотри (ничего что я на ты?) вверху есть две функции которые реализуют именно вывод дерева.Она построена примерно по твоим рекомендациям.
Потом вместо вывода я сделал функцию которая делала конкотенацию строки для передачи ее в "view".Понял что это не удобно.Решил что нужно сначала сделать выборку и занести данные в многомерный массив с большим количеством вложенности.А потом уже передать этот массив в вид, в качестве данных.Именно массив нужен потому , что он гибок в использовании.Например мне не нужно лезть в контроллер чтобы изменить выводимые теги <li></li> на <options></options>.Понимаешь о чем я?

 

Powered by ExBB FM 1.0 RC1