Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: пометить дерево sql - запроса в многомерный массив

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
jonston
Отправлено: 08 Мая, 2011 - 21:15:47
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


Помог: 3 раз(а)




Всем привет!Вопрос такой:
Есть таблица базы данных:

Если кто заметил категории связываются ключом 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.  

Если допустил ошибку при написании массива, простите!Спасибо!Всех с наступающим днем победы!


-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
Haron
Отправлено: 08 Мая, 2011 - 21:26:37
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




Покажи чем дерево выводишь.


-----
И чё?
 
 Top
jonston
Отправлено: 08 Мая, 2011 - 21:47:13
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


Помог: 3 раз(а)




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.  

(Добавление)
вопрос так и не решен.
(Добавление)
Что ответа не ждать я так понял?


-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
Mr.KreDo
Отправлено: 08 Мая, 2011 - 23:14:00
Post Id



Гость


Покинул форум
Сообщений всего: 65
Дата рег-ции: Апр. 2011  
Откуда: Старый Оскол, Россия


Помог: 0 раз(а)




jonston пишет:
(Добавление)
вопрос так и не решен.
(Добавление)
Что ответа не ждать я так понял?


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

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

(Отредактировано автором: 08 Мая, 2011 - 23:14:18)

 
 Top
jonston
Отправлено: 08 Мая, 2011 - 23:21:35
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


Помог: 3 раз(а)




Mr.KreDo пишет:
jonston пишет:
(Добавление)
вопрос так и не решен.
(Добавление)
Что ответа не ждать я так понял?


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

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


ты же в это время здесь?))


-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
Mr.KreDo
Отправлено: 08 Мая, 2011 - 23:29:00
Post Id



Гость


Покинул форум
Сообщений всего: 65
Дата рег-ции: Апр. 2011  
Откуда: Старый Оскол, Россия


Помог: 0 раз(а)




jonston пишет:
ты же в это время здесь?))


я самоучка, помочь не смогу...
 
 Top
jonston
Отправлено: 09 Мая, 2011 - 11:51:06
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


Помог: 3 раз(а)




Что никто не знает ответа?Да я думал здесь реальные спецы!


-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
komprenda
Отправлено: 09 Мая, 2011 - 12:02:00
Post Id


Гость


Покинул форум
Сообщений всего: 105
Дата рег-ции: Май 2011  


Помог: 3 раз(а)




jonston пишет:
Что никто не знает ответа?Да я думал здесь реальные спецы!


выбираешь всё из базы в $arr а затем с помощью рекурсивной функции выводишь. Пробуй-эксперементируй.

(Отредактировано автором: 09 Мая, 2011 - 15:44:57)

 
 Top
jonston
Отправлено: 09 Мая, 2011 - 12:07:59
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


Помог: 3 раз(а)




обрати внимание что я написал вверху рекурсивную функцию и к ней вспомогательную.Они выводят дерево категорий.Вопрос стоит что бы не выводить а занести данные в массив для дальнейшей передачи их в вид.
Но все равно спасибо за ответ!

(Отредактировано автором: 09 Мая, 2011 - 12:09:57)



-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
komprenda
Отправлено: 09 Мая, 2011 - 12:12:11
Post Id


Гость


Покинул форум
Сообщений всего: 105
Дата рег-ции: Май 2011  


Помог: 3 раз(а)




jonston пишет:
обрати внимание что я написал вверху рекурсивную функцию и к ней вспомогательную.Они выводят дерево категорий.Вопрос стоит что бы не выводить а занести данные в массив для дальнейшей передачи их в вид.
Но все равно спасибо за ответ!


у тебя в ней 1000 и 1 выборка из базы лучше выбрать всё сразу
 
 Top
jonston
Отправлено: 09 Мая, 2011 - 12:19:00
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


Помог: 3 раз(а)




Да я в курсе что в плане оптимизации запроса далеко не самый лучший вариант.
Вопрос состоит не в этом.Вопрос состоит в том как использовать рекурсию чтобы правильно создать массив данных.


-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
Мелкий Супермодератор
Отправлено: 09 Мая, 2011 - 12:28:18
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




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. }


-----
PostgreSQL DBA
 
 Top
jonston
Отправлено: 09 Мая, 2011 - 12:31:49
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


Помог: 3 раз(а)




Мелкий, спасибо!Сейчас попробую!Скажи когда я смогу говорить "спасибо"?
(Добавление)
Мелкий, отчасти ты решил проблему!Вот что получилось:
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. Массив который должен получится смотри вверху этого топика.


-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
EuGen Администратор
Отправлено: 09 Мая, 2011 - 14:21:25
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




jonston пишет:
Как это решить без рекурсии?

Без рекурсии у Вас не получится. Вам же нужна неограниченная вложенность.
Вообще древовидные струкруры в реляционной БД строятся "плохо" - то есть Вам приходится в любом случае делать запрос за запросом.
Иными словами:
0. Делаете запрос на выборку из таблицы, где parent_id=0
1. Пробегаетесь по строкам
2. Делаете запрос на выборку из таблицы, где parent_id=значению в текущей строке.
Для организации рекурсии нужно объединить запрос на выборку и перебор строк в одну функцию, принимающаю параметр id (это parent_id, по которому функция сделает выборку) и возвращающая все строки, у которых parent_id = переданному этой функции id.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
jonston
Отправлено: 09 Мая, 2011 - 14:37:04
Post Id



Посетитель


Покинул форум
Сообщений всего: 455
Дата рег-ции: Март 2011  


Помог: 3 раз(а)




Спасибо!Посмотри (ничего что я на ты?) вверху есть две функции которые реализуют именно вывод дерева.Она построена примерно по твоим рекомендациям.
Потом вместо вывода я сделал функцию которая делала конкотенацию строки для передачи ее в "view".Понял что это не удобно.Решил что нужно сначала сделать выборку и занести данные в многомерный массив с большим количеством вложенности.А потом уже передать этот массив в вид, в качестве данных.Именно массив нужен потому , что он гибок в использовании.Например мне не нужно лезть в контроллер чтобы изменить выводимые теги <li></li> на <options></options>.Понимаешь о чем я?


-----
$i = 0;
$i = $i++ + ++$i; ?
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB