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
Форумы портала PHP.SU :: Версия для печати :: Сложный массив
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » Сложный массив

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

1. dizzy - 11 Мая, 2013 - 23:04:36 - перейти к сообщению
В базе в одной таблице хранятся группы, а в другой их отношения, кто кому является родителем. Нужно вывести их в виде меню, вложенность не ограничена.

sql:
SELECT * FROM PROD_GROUPS pr LEFT JOIN GROUP_TO_GROUP gr ON pr.PRG_ID = gr.GTG_LEAD_ID OR pr.PRG_ID = gr.GTG_FOLLOW_ID

получается что-то типа такого (id | имя | родитель | потомок):
id: 39 | Комплекты мебели | lead: 39 | follow: 235
id: 39 | Комплекты мебели | lead: 39 | follow: 40
id: 39 | Комплекты мебели | lead: 39 | follow: 236
id: 39 | Комплекты мебели | lead: 39 | follow: 237
id: 39 | Комплекты мебели | lead: 39 | follow: 238
id: 39 | Комплекты мебели | lead: 39 | follow: 239
id: 40 | Кофейные комплекты | lead: 39 | follow: 40
id: 99 | Загородные аксессуары | lead: 99 | follow: 240
id: 99 | Загородные аксессуары | lead: 99 | follow: 241
id: 99 | Загородные аксессуары | lead: 99 | follow: 242
id: 99 | Загородные аксессуары | lead: 99 | follow: 243
id: 235 | Диваны | lead: 39 | follow: 235
id: 235 | Диваны | lead: 235 | follow: 244
id: 236 | Подвесные кресла | lead: 39 | follow: 236
id: 237 | Обеденные комплекты | lead: 39 | follow: 237
id: 238 | Шезлонги | lead: 39 | follow: 238
id: 239 | Гамаки | lead: 39 | follow: 239
id: 240 | Кашпо | lead: 99 | follow: 240
id: 241 | Мангалы-барбекю | lead: 99 | follow: 241
id: 242 | Уличные зонты | lead: 99 | follow: 242
id: 243 | Уличные обогреватели | lead: 99 | follow: 243
id: 244 | sub-sub | lead: 235 | follow: 244
id: 244 | sub-sub | lead: 244 | follow: 245
id: 245 | sub-sub-sub | lead: 244 | follow: 245



сортировка:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. foreach ($groups as $group) {
  3.         $id = $group["PRG_ID"];
  4.         $title = $group["PRG_METATITLE"];
  5.         $name = $group["PRG_TITLE"];
  6.         $lead = $group["GTG_LEAD_ID"];
  7.         $follow = $group["GTG_FOLLOW_ID"];
  8.        
  9.        
  10.         if($follow != $id){
  11.                 $groups_menu[$id] = array("id"=>$id, "name"=>$name, "title"=>$title, "lead"=>$lead, "follow"=>array());
  12.         }
  13.         else{
  14.                 if($lead != $follow)
  15.                         $groups_menu[$lead]["follow"][$id] = array("id"=>$id, "name"=>$name, "title"=>$title, "lead"=>$lead);
  16.                 else
  17.                         $groups_menu[$lead]["follow"][$id] = array("id"=>$id, "name"=>$name, "title"=>$title, "lead"=>$lead, "follow"=>array("id"=>$id, "name"=>$name, "title"=>$title, "lead"=>$lead, "follow"=>$follow));
  18.         }
  19. }
  20.  



массив $groups:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. (
  3.     [39] => Array
  4.         (
  5.             [id] => 39
  6.             [name] => Комплекты мебели
  7.             [title] => Комплекты мебели
  8.             [lead] => 39
  9.             [follow] => Array
  10.                 (
  11.                     [40] => Array
  12.                         (
  13.                             [id] => 40
  14.                             [name] => Кофейные комплекты
  15.                             [title] => Кофейные комплекты
  16.                             [lead] => 39
  17.                         )
  18.  
  19.                     [235] => Array
  20.                         (
  21.                             [id] => 235
  22.                             [name] => Диваны
  23.                             [title] => Диваны
  24.                             [lead] => 39
  25.                         )
  26.  
  27.                     [236] => Array
  28.                         (
  29.                             [id] => 236
  30.                             [name] => Подвесные кресла
  31.                             [title] => Подвесные кресла
  32.                             [lead] => 39
  33.                         )
  34.  
  35.                     [237] => Array
  36.                         (
  37.                             [id] => 237
  38.                             [name] => Обеденные комплекты
  39.                             [title] => Обеденные комплекты
  40.                             [lead] => 39
  41.                         )
  42.  
  43.                     [238] => Array
  44.                         (
  45.                             [id] => 238
  46.                             [name] => Шезлонги
  47.                             [title] => Шезлонги
  48.                             [lead] => 39
  49.                         )
  50.  
  51.                     [239] => Array
  52.                         (
  53.                             [id] => 239
  54.                             [name] => Гамаки
  55.                             [title] => Гамаки
  56.                             [lead] => 39
  57.                         )
  58.  
  59.                 )
  60.  
  61.         )
  62.  
  63.     [99] => Array
  64.         (
  65.             [id] => 99
  66.             [name] => Загородные аксессуары
  67.             [title] => Загородные аксессуары
  68.             [lead] => 99
  69.             [follow] => Array
  70.                 (
  71.                     [240] => Array
  72.                         (
  73.                             [id] => 240
  74.                             [name] => Кашпо
  75.                             [title] => Кашпо
  76.                             [lead] => 99
  77.                         )
  78.  
  79.                     [241] => Array
  80.                         (
  81.                             [id] => 241
  82.                             [name] => Мангалы-барбекю
  83.                             [title] => Мангалы-барбекю
  84.                             [lead] => 99
  85.                         )
  86.  
  87.                     [242] => Array
  88.                         (
  89.                             [id] => 242
  90.                             [name] => Уличные зонты
  91.                             [title] => Уличные зонты
  92.                             [lead] => 99
  93.                         )
  94.  
  95.                     [243] => Array
  96.                         (
  97.                             [id] => 243
  98.                             [name] => Уличные обогреватели
  99.                             [title] => Уличные обогреватели
  100.                             [lead] => 99
  101.                         )
  102.  
  103.                 )
  104.  
  105.         )
  106.  
  107.     [235] => Array
  108.         (
  109.             [id] => 235
  110.             [name] => Диваны
  111.             [title] => Диваны
  112.             [lead] => 235
  113.             [follow] => Array
  114.                 (
  115.                     [244] => Array
  116.                         (
  117.                             [id] => 244
  118.                             [name] => sub-sub
  119.                             [title] => title
  120.                             [lead] => 235
  121.                         )
  122.  
  123.                 )
  124.  
  125.         )
  126.  
  127.     [244] => Array
  128.         (
  129.             [id] => 244
  130.             [name] => sub-sub
  131.             [title] => title
  132.             [lead] => 244
  133.             [follow] => Array
  134.                 (
  135.                     [245] => Array
  136.                         (
  137.                             [id] => 245
  138.                             [name] => sub-sub-sub
  139.                             [title] => tttttt
  140.                             [lead] => 244
  141.                         )
  142.  
  143.                 )
  144.  
  145.         )
  146.  
  147. )
  148.  



Подскажите, как сделать это правильно. Так, чтобы все потомки потомков находились друг в друге. Сейчас они отдельно.
Не знаю, как нормально сформулировать. Надеюсь, будет понятно)
2. DeepVarvar - 12 Мая, 2013 - 00:40:04 - перейти к сообщению
Это рекурсия, дядя:
PHP:
скопировать код в буфер обмена
  1. function makeTreeArray(& $array, $parent = 0) {
  2.   $branch = array();
  3.   if ($array) {
  4.     foreach ($array as $k => $item) {
  5.       if ($item['parent_id'] == $parent) {
  6.         unset($array[$k]);
  7.         $current = array(
  8.           "children" => makeTreeArray($array, $item['id']),
  9.           "name" => $item['name']
  10.         );
  11.         array_push($branch, $current);
  12.       }
  13.     }
  14.   }
  15.   return $branch;
  16. }

Данный пример работает для результата из БД вида: id, parent_id, name.
Обязательное условие при выборке - ORDER BY parent_id ASC.
Собирает он массив вложенных потомков вида:
CODE (phparray):
скопировать код в буфер обмена
  1. array(
  2.   "name" => "bla bla",
  3.   "children" => array(
  4.     array(
  5.       "name" => "bla bla",
  6.       "children" => array(
  7.         // ну и так далее..
  8.       )
  9.     )
  10.   )
  11. );

Переделать под себя, я надеюсь осилишь..
3. dizzy - 12 Мая, 2013 - 16:43:19 - перейти к сообщению
Не совсем осилил)
У меня массив со связями индексирован начиная с 0 по порядку. А id у групп начинается далеко не с 0.

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. (
  3.     [0] => Array
  4.         (
  5.             [PRG_ID] => 39
  6.             [PRG_TITLE] => Комплекты мебели
  7.             [PRG_METATITLE] => Комплекты мебели
  8.             [GTG_LEAD_ID] => 39
  9.             [GTG_FOLLOW_ID] => 235
  10.         )
  11.  
  12.     [1] => Array
  13.         (
  14.             [PRG_ID] => 39
  15.             [PRG_TITLE] => Комплекты мебели
  16.             [PRG_METATITLE] => Комплекты мебели
  17.             [GTG_LEAD_ID] => 39
  18.             [GTG_FOLLOW_ID] => 40
  19.         )
  20.  
  21.     [2] => Array
  22.         (
  23.             [PRG_ID] => 39
  24.             [PRG_TITLE] => Комплекты мебели
  25.             [PRG_METATITLE] => Комплекты мебели
  26.             [GTG_LEAD_ID] => 39
  27.             [GTG_FOLLOW_ID] => 236
  28.         )
  29.  
  30.     [3] => Array
  31.         (
  32.             [PRG_ID] => 39
  33.             [PRG_TITLE] => Комплекты мебели
  34.             [PRG_METATITLE] => Комплекты мебели
  35.             [GTG_LEAD_ID] => 39
  36.             [GTG_FOLLOW_ID] => 237
  37.         )
  38.  
  39.     [4] => Array
  40.         (
  41.             [PRG_ID] => 39
  42.             [PRG_TITLE] => Комплекты мебели
  43.             [PRG_METATITLE] => Комплекты мебели
  44.             [GTG_LEAD_ID] => 39
  45.             [GTG_FOLLOW_ID] => 238
  46.         )
  47.  
  48.     [5] => Array
  49.         (
  50.             [PRG_ID] => 39
  51.             [PRG_TITLE] => Комплекты мебели
  52.             [PRG_METATITLE] => Комплекты мебели
  53.             [GTG_LEAD_ID] => 39
  54.             [GTG_FOLLOW_ID] => 239
  55.         )
  56.  
  57.     [6] => Array
  58.         (
  59.             [PRG_ID] => 40
  60.             [PRG_TITLE] => Кофейные комплекты
  61.             [PRG_METATITLE] => Кофейные комплекты
  62.             [GTG_LEAD_ID] => 39
  63.             [GTG_FOLLOW_ID] => 40
  64.         )
  65.  
  66.     [7] => Array
  67.         (
  68.             [PRG_ID] => 99
  69.             [PRG_TITLE] => Загородные аксессуары
  70.             [PRG_METATITLE] => Загородные аксессуары
  71.             [GTG_LEAD_ID] => 99
  72.             [GTG_FOLLOW_ID] => 240
  73.         )
  74.  
  75.     [8] => Array
  76.         (
  77.             [PRG_ID] => 99
  78.             [PRG_TITLE] => Загородные аксессуары
  79.             [PRG_METATITLE] => Загородные аксессуары
  80.             [GTG_LEAD_ID] => 99
  81.             [GTG_FOLLOW_ID] => 241
  82.         )
  83.  
  84.     [9] => Array
  85.         (
  86.             [PRG_ID] => 99
  87.             [PRG_TITLE] => Загородные аксессуары
  88.             [PRG_METATITLE] => Загородные аксессуары
  89.             [GTG_LEAD_ID] => 99
  90.             [GTG_FOLLOW_ID] => 242
  91.         )
  92.  
  93.     [10] => Array
  94.         (
  95.             [PRG_ID] => 99
  96.             [PRG_TITLE] => Загородные аксессуары
  97.             [PRG_METATITLE] => Загородные аксессуары
  98.             [GTG_LEAD_ID] => 99
  99.             [GTG_FOLLOW_ID] => 243
  100.         )
  101.  
  102.     [11] => Array
  103.         (
  104.             [PRG_ID] => 235
  105.             [PRG_TITLE] => Диваны
  106.             [PRG_METATITLE] => Диваны
  107.             [GTG_LEAD_ID] => 39
  108.             [GTG_FOLLOW_ID] => 235
  109.         )
  110.  
  111.     [12] => Array
  112.         (
  113.             [PRG_ID] => 235
  114.             [PRG_TITLE] => Диваны
  115.             [PRG_METATITLE] => Диваны
  116.             [GTG_LEAD_ID] => 235
  117.             [GTG_FOLLOW_ID] => 244
  118.         )
  119.  
  120.     [13] => Array
  121.         (
  122.             [PRG_ID] => 236
  123.             [PRG_TITLE] => Подвесные кресла
  124.             [PRG_METATITLE] => Подвесные кресла
  125.             [GTG_LEAD_ID] => 39
  126.             [GTG_FOLLOW_ID] => 236
  127.         )
  128.  
  129.     [14] => Array
  130.         (
  131.             [PRG_ID] => 237
  132.             [PRG_TITLE] => Обеденные комплекты
  133.             [PRG_METATITLE] => Обеденные комплекты
  134.             [GTG_LEAD_ID] => 39
  135.             [GTG_FOLLOW_ID] => 237
  136.         )
  137.  
  138.     [15] => Array
  139.         (
  140.             [PRG_ID] => 238
  141.             [PRG_TITLE] => Шезлонги
  142.             [PRG_METATITLE] => Шезлонги
  143.             [GTG_LEAD_ID] => 39
  144.             [GTG_FOLLOW_ID] => 238
  145.         )
  146.  
  147.     [16] => Array
  148.         (
  149.             [PRG_ID] => 239
  150.             [PRG_TITLE] => Гамаки
  151.             [PRG_METATITLE] => Гамаки
  152.             [GTG_LEAD_ID] => 39
  153.             [GTG_FOLLOW_ID] => 239
  154.         )
  155.  
  156.     [17] => Array
  157.         (
  158.             [PRG_ID] => 240
  159.             [PRG_TITLE] => Кашпо
  160.             [PRG_METATITLE] => Кашпо
  161.             [GTG_LEAD_ID] => 99
  162.             [GTG_FOLLOW_ID] => 240
  163.         )
  164.  
  165.     [18] => Array
  166.         (
  167.             [PRG_ID] => 241
  168.             [PRG_TITLE] => Мангалы-барбекю
  169.             [PRG_METATITLE] => Мангалы-барбекю
  170.             [GTG_LEAD_ID] => 99
  171.             [GTG_FOLLOW_ID] => 241
  172.         )
  173.  
  174.     [19] => Array
  175.         (
  176.             [PRG_ID] => 242
  177.             [PRG_TITLE] => Уличные зонты
  178.             [PRG_METATITLE] => Уличные зонты
  179.             [GTG_LEAD_ID] => 99
  180.             [GTG_FOLLOW_ID] => 242
  181.         )
  182.  
  183.     [20] => Array
  184.         (
  185.             [PRG_ID] => 243
  186.             [PRG_TITLE] => Уличные обогреватели
  187.             [PRG_METATITLE] => Уличные обогреватели
  188.             [GTG_LEAD_ID] => 99
  189.             [GTG_FOLLOW_ID] => 243
  190.         )
  191.  
  192.     [21] => Array
  193.         (
  194.             [PRG_ID] => 244
  195.             [PRG_TITLE] => sub-sub
  196.             [PRG_METATITLE] => title
  197.             [GTG_LEAD_ID] => 235
  198.             [GTG_FOLLOW_ID] => 244
  199.         )
  200.  
  201.     [22] => Array
  202.         (
  203.             [PRG_ID] => 244
  204.             [PRG_TITLE] => sub-sub
  205.             [PRG_METATITLE] => title
  206.             [GTG_LEAD_ID] => 244
  207.             [GTG_FOLLOW_ID] => 2
  208.         )
  209.  
  210.     [23] => Array
  211.         (
  212.             [PRG_ID] => 2
  213.             [PRG_TITLE] => sub-sub-sub
  214.             [PRG_METATITLE] => tttttt
  215.             [GTG_LEAD_ID] => 244
  216.             [GTG_FOLLOW_ID] => 2
  217.         )
  218.  
  219. )
  220.  
  221.  




то есть условие if ($item['parent_id'] == $parent) никогда не выполнится, а получить индекс массива внутри функции нельзя
4. DeepVarvar - 13 Мая, 2013 - 22:13:01 - перейти к сообщению
Написал бы хотябы что-то вида "Я пробовал вот так и вот так"
5. dizzy - 14 Мая, 2013 - 09:35:25 - перейти к сообщению
Все получилось, спасибо. Оказалось, что руки кривые)
6. dizzy - 14 Мая, 2013 - 20:33:11 - перейти к сообщению
Может еще подскажете, как сделать активной всю ветку меню с активным пунктом (добавить css класс)?

Меню делается так:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. function makeTreeMenu($arr){
  3.     $out = '';
  4.     $out .= '<ul>';
  5.  
  6.     foreach($arr as $k=>$v){  
  7.  
  8.         $out .= '<li><a href="/catalog/'.$v['id'].'">'.$v['name'].'</a></li>';
  9.         if(!empty($v['children'])){
  10.             $out .= makeTreeMenu($v['children']);
  11.         }
  12.     }
  13.     $out .= '</ul>';
  14.     return $out;
  15. }
  16.  

 

Powered by ExBB FM 1.0 RC1