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 :: Перебор массива данных

 PHP.SU

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


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

> Описание: Проблемы с выводом меню категорий и подкатегорий
awotara
Отправлено: 11 Ноября, 2016 - 13:02:02
Post Id



Гость


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


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




Добрый день, короче говоря, есть такой массив с данными для меню. Как можете видеть это для меню с выпадающим списком подменю. Вопрос в том, как мне перебрать массив, так чтоб, у пункта меню "Меню1-1" были подставлены все пункты "Меню1-2". На этом примере, что я прикрепил, все пункты меню, идут по порядку, тоесть под элементом [0](Меню1-1) идут дальше его элементы (подпункты меню "Меню1-2") [1] и так дальше. Помогите ребята, как их собрать в кучу, что б "Меню1-1" имело свои подпункты "Меню1-2"

Спойлер (Отобразить)

(Отредактировано автором: 11 Ноября, 2016 - 13:03:37)



-----
черная подставка, внизу надпись ACER
 
 Top
Prizma
Отправлено: 11 Ноября, 2016 - 13:47:51
Post Id



Посетитель


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


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




а как ты эти данные получаешь в этот массив?
если они там просто написаны в коде, тогда просто измени структуру массива на более логичную и на выводе прогоняй через цикл или рекурсию
 
My status
 Top
awotara
Отправлено: 11 Ноября, 2016 - 14:28:04
Post Id



Гость


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


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




эти данные вообще получаются из базы данных одним сплошным списком, я их прогнал через цикл foreach, что б хоть как-то разделить категории от подкатегорий, может я что-то сделал не так, поправьте. Запрос работает в функции, где и работает рекурсия в цикле while

PHP:
скопировать код в буфер обмена
  1.  
  2. foreach ($rsaultcat as $keys => $values) {
  3.   if($values['idcv'] !== ""){
  4.       $data[$keys][1] = "<a href='".$values['url']."'>".$values['text']."</a>";
  5.   }else{
  6.       $data[$keys][0] = "<a href='".$values['url']."'>".$values['text']."</a>";
  7.   }
  8. }
  9.  


-----
черная подставка, внизу надпись ACER
 
 Top
NeuroZ
Отправлено: 11 Ноября, 2016 - 14:41:12
Post Id



Посетитель


Покинул форум
Сообщений всего: 393
Дата рег-ции: Апр. 2012  


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




Цитата:
[1]

Плохо. Лучше заводить отдельную переменную, отвечающую за уровень или за родителя
Пример
CODE (htmlphp):
скопировать код в буфер обмена
  1. [
  2. 'id' => 1,
  3. 'link' => 'url',
  4. 'parent' => 0]

соответственно у подпунктов parent равен ID родителя.

Второй метод если использовать вместо parent - level в качестве обозначения уровня вложенности, но тут надо тогда соблюдать строгий порядок при выборке (как в примере).
Соответственно многомерный массив тут не нужен.

В вашем случае:
PHP:
скопировать код в буфер обмена
  1. foreach ($rsaultcat as $keys => $values) {
  2.   $data[$keys]['link'] = "<a href='".$values['url']."'>".$values['text']."</a>";
  3.   $data[$keys]['level'] = ($values['idcv'] !== "") ? 1 : 0;
  4. }

Не совсем понятно что такое idcv и какой вардамп массив $rsaultcat

(Отредактировано автором: 11 Ноября, 2016 - 14:44:05)

 
 Top
awotara
Отправлено: 11 Ноября, 2016 - 14:52:15
Post Id



Гость


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


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




Вот распечатал полученный массив $rsaultcat, а $values['idcv'] это обычный индекс, который подставляется после каждого прохода цикла while, я использовал для разделения его, не более того.

PHP:
скопировать код в буфер обмена
  1.  
  2. (
  3.     [0] => Array
  4.         (
  5.             [id] => 92
  6.             [text] => Натуральные витамины
  7.             [urlsadr] => http://localhost
  8.             [classnames] =>
  9.             [idcv] =>
  10.         )
  11.  
  12.     [1] => Array
  13.         (
  14.             [id] => 93
  15.             [text] => &nbsp;Солодовые экстракты ТМ "Полисол"
  16.             [urlsadr] => http://localhost
  17.             [classnames] => submenu-views
  18.             [idcv] => 1
  19.         )
  20.  
  21.     [2] => Array
  22.         (
  23.             [id] => 94
  24.             [text] => &nbsp;Паста  ТМ "Liqberry"
  25.             [urlsadr] => http://localhost
  26.             [classnames] => submenu-views
  27.             [idcv] => 1
  28.         )
  29.  
  30.     [3] => Array
  31.         (
  32.             [id] => 91
  33.             [text] => Продукты пчеловодства
  34.             [urlsadr] => http://localhost
  35.             [classnames] =>
  36.             [idcv] =>
  37.         )
  38.  
  39.     [4] => Array
  40.         (
  41.             [id] => 86
  42.             [text] => &nbsp;Мед Карпат    НОВИНКА!
  43.             [urlsadr] => http://localhost
  44.             [classnames] => submenu-views
  45.             [idcv] => 2
  46.         )
  47.  
  48.     [5] => Array
  49.         (
  50.             [id] => 87
  51.             [text] => &nbsp;Медовые композиции
  52.             [urlsadr] => http://localhost
  53.             [classnames] => submenu-views
  54.             [idcv] => 2
  55.         )
  56.  
  57.     [6] => Array
  58.         (
  59.             [id] => 46
  60.             [text] => Фиточаи Naturalis
  61.             [urlsadr] => http://localhost
  62.             [classnames] =>
  63.             [idcv] =>
  64.         )
  65.  
  66.     [7] => Array
  67.         (
  68.             [id] => 2
  69.             [text] => Закваски
  70.             [urlsadr] => http://localhost
  71.             [classnames] =>
  72.             [idcv] =>
  73.         )
  74.  
  75.     [8] => Array
  76.         (
  77.             [id] => 95
  78.             [text] => Пищевые добавки
  79.             [urlsadr] => http://localhost
  80.             [classnames] =>
  81.             [idcv] =>
  82.         )
  83.  
  84.     [9] => Array
  85.         (
  86.             [id] => 65
  87.             [text] => &nbsp;ШРОТЫ
  88.             [urlsadr] => http://localhost
  89.             [classnames] => submenu-views
  90.             [idcv] => 5
  91.         )
  92.  
  93.     [10] => Array
  94.         (
  95.             [id] => 50
  96.             [text] => &nbsp;Клетчатка
  97.             [urlsadr] => http://localhost
  98.             [classnames] => submenu-views
  99.             [idcv] => 5
  100.         )
  101.  
  102.     [11] => Array
  103.         (
  104.             [id] => 67
  105.             [text] => &nbsp;Фитокомплексы «CHOICE»
  106.             [urlsadr] => http://localhost
  107.             [classnames] => submenu-views
  108.             [idcv] => 5
  109.         )
  110.  
  111.     [12] => Array
  112.         (
  113.             [id] => 85
  114.             [text] => &nbsp;Соевые продукты
  115.             [urlsadr] => http://localhost
  116.             [classnames] => submenu-views
  117.             [idcv] => 5
  118.         )
  119.  
  120.     [13] => Array
  121.         (
  122.             [id] => 4
  123.             [text] => &nbsp;Сухое молоко и сливки
  124.             [urlsadr] => http://localhost
  125.             [classnames] => submenu-views
  126.             [idcv] => 5
  127.         )
  128.  
  129.     [14] => Array
  130.         (
  131.             [id] => 40
  132.             [text] => &nbsp;Отруби диетические
  133.             [urlsadr] => http://localhost
  134.             [classnames] => submenu-views
  135.             [idcv] => 5
  136.         )
  137.  
  138.     [15] => Array
  139.         (
  140.             [id] => 76
  141.             [text] => &nbsp;Функциональные продукты
  142.             [urlsadr] => http://localhost
  143.             [classnames] => submenu-views
  144.             [idcv] => 5
  145.         )
  146.  
  147.     [16] => Array
  148.         (
  149.             [id] => 89
  150.             [text] => Соковые напитки
  151.             [urlsadr] => http://localhost
  152.             [classnames] =>
  153.             [idcv] =>
  154.         )
  155.  
  156.     [17] => Array
  157.         (
  158.             [id] => 52
  159.             [text] => Растительные масла
  160.             [urlsadr] => http://localhost
  161.             [classnames] =>
  162.             [idcv] =>
  163.         )
  164.  
  165.     [18] => Array
  166.         (
  167.             [id] => 96
  168.             [text] => Натуральная косметика
  169.             [urlsadr] => http://localhost
  170.             [classnames] =>
  171.             [idcv] =>
  172.         )
  173.  
  174.     [19] => Array
  175.         (
  176.             [id] => 70
  177.             [text] => &nbsp;Косметика ТМ "Яка"
  178.             [urlsadr] => http://localhost
  179.             [classnames] => submenu-views
  180.             [idcv] => 8
  181.         )
  182.  
  183.     [20] => Array
  184.         (
  185.             [id] => 83
  186.             [text] => &nbsp;Косметика ТМ "Whitemandarin"
  187.             [urlsadr] => http://localhost
  188.             [classnames] => submenu-views
  189.             [idcv] => 8
  190.         )
  191.  
  192.     [21] => Array
  193.         (
  194.             [id] => 71
  195.             [text] => &nbsp;Масла ТМ "Flora Secret"
  196.             [urlsadr] => http://localhost
  197.             [classnames] => submenu-views
  198.             [idcv] => 8
  199.         )
  200.  
  201. )
  202.  

(Добавление)
Там где есть элемент $values['idcv'] , это и есть подкатегория, а где нет это категория


-----
черная подставка, внизу надпись ACER
 
 Top
Prizma
Отправлено: 11 Ноября, 2016 - 15:02:12
Post Id



Посетитель


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


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




awotara пишет:
может я что-то сделал не так,

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

В итоге будет что такое:
PHP:
скопировать код в буфер обмена
  1. $ar = [...];
  2. $categories = [];
  3. $structure = [];
  4. // разбираем по массивам
  5. foreach ($ar as $category) {
  6.         $categoryId = $category['id'];
  7.         $parentId = $category['parent_id']
  8.         $categories[$categoryId] = $category;
  9.         if(!isset($structure[$parentId])) {
  10.                 $structure[$parentId] = [];
  11.         }
  12.         $structure[$parentId][] = $categoryId;
  13. }
  14. // вывод
  15. // допустим 0 - это parent_id топ меню
  16. foreach ($structure[0] as $categoryId) {
  17.         $category = $categories[$categoryId];
  18.         // выводим ...
  19.         if(isset($structure[$categoryId])) {
  20.                 foreach ($structure[$categoryId] as $childCategoryId) {
  21.                         $childCategory = $categories[$childCategoryId];
  22.                         // выводим дочернии категории
  23.                 }
  24.         }
  25. }

Я бы лучше делал через рекурсию, особенно актуально если вложенность категорий больше 2.
 
My status
 Top
awotara
Отправлено: 11 Ноября, 2016 - 15:02:44
Post Id



Гость


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


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




Вот сама функция, которая возвращает массив $rsaultcat

PHP:
скопировать код в буфер обмена
  1.  
  2. function mscm_get_category_tree($parent_id = '0', $classnam = '', $idsv = '', $spacing = '', $exclude = '', $category_tree_array = '', $include_itself = false) {
  3.     global $lang_id;
  4.  
  5.     if (GRP_CHECKED == 'true') {
  6.       $group_check = "and c.group_permission_".$_SESSION['cust_stat']['cust_stat_id']."=1 ";
  7.     }
  8.  
  9.     $categories_query = mscm_db_query("select c.categories_id, cd.categories_name, c.parent_id from " . TAB_CATEGORIES . " c, " . TAB_CAT_DESCRIPT . " cd where c.categories_status = '1' and c.categories_id = cd.categories_id ".$group_check." and cd.language_id = '" . (int)$_SESSION['lang_id'] . "' and c.parent_id = '" . (int)$parent_id . "' order by c.sort_order, cd.categories_name");
  10.      
  11.      
  12.     $is = 1;
  13.     while ($categories = mscm_fetch_array($categories_query)) {
  14.       if ($exclude != $categories['categories_id']){
  15.  
  16.           $cPath_new=mscm_category_link($categories['categories_id'],$categories['categories_name']);
  17.  
  18.         $catsub_string = mscm_href_link(FILENAME_DEFAULT, $cPath_new);
  19.  
  20.           $category_tree_array[] = array(
  21.             'id' => $categories['categories_id'],
  22.             'text' => $spacing . $categories['categories_name'],
  23.             'urlsadr' => $catsub_string,
  24.             'classnames' => $classnam,
  25.             'idcv' => $idsv
  26.           );
  27.  
  28.           $category_tree_array = mscm_get_category_tree(
  29.             $categories['categories_id'],
  30.             $classnam . 'submenu-views',
  31.             $idsv . $is,
  32.             $spacing . '&nbsp;',
  33.             $exclude,
  34.             $category_tree_array
  35.           );
  36.           $is++;
  37.       }
  38.  
  39.     }
  40.  
  41.     return $category_tree_array;
  42.   }
  43.  


-----
черная подставка, внизу надпись ACER
 
 Top
Prizma
Отправлено: 11 Ноября, 2016 - 15:03:31
Post Id



Посетитель


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


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




в твоем случае idcv похоже и есть parent_id
 
My status
 Top
NeuroZ
Отправлено: 11 Ноября, 2016 - 15:06:44
Post Id



Посетитель


Покинул форум
Сообщений всего: 393
Дата рег-ции: Апр. 2012  


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




в частном случае:
PHP:
скопировать код в буфер обмена
  1.  
  2. $tmp = [];
  3. foreach ($rsaultcat as $k => $v) {
  4. if (!empty($v['classnames'])) $parent = $k;
  5. else $rsaultca[$parent]['childs'][] = $v;
  6. }
  7.  

при этом idcv вообще можешь выкинуть.
Если в общем случае, то переименуй idcv в level и при выборке пусть у тебя будет заполнены соответствующие значения (0 для первого уровня, 1 для второго и т.д.), а в проверке проверяй не classnames, а level, и не на пустоту, а на вложенность, таким образом можно составить многоуровневое меню (при условии, что у тебя все пункты находятся в порядке иерархии).

(Отредактировано автором: 11 Ноября, 2016 - 15:09:51)

 
 Top
awotara
Отправлено: 11 Ноября, 2016 - 15:58:30
Post Id



Гость


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


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




Спасибо всем за ответы, я вчера пол дня потратил и так и не нашел решения, но вот сегодня я все таки поборол это меню ))), отдельное спасибо Prizma , твой пример подошел, я разметил меню как мне надо, дальше уже не составит труда красиво заверстать его, вот как у меня получилось:

PHP:
скопировать код в буфер обмена
  1.  
  2. foreach ($rsaultcat as $category) {
  3.         $categoryId = $category['id'];
  4.         $parentId = $category['parent_id'];
  5.         $categories[$categoryId] = $category;
  6.         if(!isset($structure[$parentId])) {
  7.                 $structure[$parentId] = [];
  8.         }
  9.         $structure[$parentId][] = $categoryId;
  10. }
  11.  
  12. foreach ($structure[0] as $categoryId) {
  13.   $category = $categories[$categoryId];
  14.  
  15.   $datas[] = "<li class='categories-views'>";
  16.      $datas[] = "<a href='".
  17.         $category['urlsadr'].
  18.         "'>".
  19.         $category['text'].
  20.       "</a>";
  21.  
  22.     if(isset($structure[$categoryId])) {
  23.           $datas[] = "<ul class='subcategories-list'>";
  24.             foreach ($structure[$categoryId] as $childCategoryId) {
  25.                     $childCategory = $categories[$childCategoryId];
  26.  
  27.                     $datas[] = "<li><a href='".
  28.                     $childCategory['urlsadr'].
  29.                     "'>".
  30.                     $childCategory['text'].
  31.                     "</a></li>";
  32.             }
  33.           $datas[] = "</ul>";
  34.     }
  35.   $datas[] = "</li>";    
  36. }
  37.  


-----
черная подставка, внизу надпись ACER
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB