Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 67

Дублирование данных при переборе foreach

27.04.2017, 11:59. Показов 1145. Ответов 2

Студворк — интернет-сервис помощи студентам
Добрый день. Помогите найти ошибку, уже несколько раз с нуля переписывал.

В общем пытаюсь вывести меню. Меню выводится и сортируется в нужном мне порядке все отлично, но вот один баг который не могу не как исправить, дублируются пункты меню, при чем не все, а только со второй вложенности.
В базе пункты в единственном экземпляре.
Есть массив главный массив $nodes с которого я и достаю все пункты меню.
Сам класс который выводит меню.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
class Menu
{
 
 
    public function renderMenu($nodes)
    {
        $subMenu = [];
        $lines = [];
        foreach ($nodes['nodes'] as $node)
        {
            if($node['is_visible_for_all']){
                if(count($node['nodes']) > 0){
                    if($node['navigations_types__alias'] == 'section'){
                        //megamenu
                        if($node['is_visible_for_all']){
                            $sort = $node['sort_no'];
                            $alias = $node['alias'];
                            $label = $node['navigation_label'];
                            $megaMenu[] = "<li data-sort='$sort' class='dropdown dropdown-megamenu'><a href='$alias' class='dropdown-toggle' data-toggle='dropdown' data-target='#'>$label</a><ul class='dropdown-menu'><li><div class='header-navigation-content'><div class='row'>";
 
                            foreach ($node['nodes'] as $m_node)
                            {
                                $sort = $m_node['sort_no'];
                                $alias = $m_node['alias'];
                                $label = $m_node['navigation_label'];
                                $headMenu[] = "<div data-sort='$sort' class='col-md-6 header-navigation-col'><h4><a href='$alias'>$label</a></h4><ul></ul></div>";
 
                                asort($headMenu);
                                $headMenu_str = implode('', $headMenu);
                                $megaMenuStr = implode('', $megaMenu);
                                $megaMenuStr .= $headMenu_str . "</li></div></div></ul></li>";
                                unset($m_node);
                            }
 
                            array_push($lines, $megaMenuStr);
                        }
                    }else{
                        //menu
                        $sort = $node['sort_no'];
                        $alias = $node['alias'];
                        $label = $node['navigation_label'];
                        $mainMenu= "<li data-sort='$sort' class='dropdown'><a href='/$alias' class='dropdown-toggle' data-toggle='dropdown' data-target='#'>$label</a><ul class='dropdown-menu'>";
 
                        foreach ($node['nodes'] as $nodes)
                        {
                            if($nodes['is_visible_for_all']){
                                if(count($nodes['nodes']) > 0){
                                    //submenu
                                    $sort = $nodes['sort_no'];
                                    $alias = $nodes['alias'];
                                    $label = $nodes['navigation_label'];
 
                                    $subMenu[] = "<li data-sort='$sort' class='dropdown-submenu'><a href='/$alias' class='dropdown-toggle' data-toggle='dropdown' data-target='#'>$label</a>";
 
                                    foreach ($nodes['nodes'] as $subnodes)
                                    {
                                        if(count($subnodes['nodes']) > 0){
                                            if($subnodes['is_visible_for_all'])
                                            {
                                                $sort = $subnodes['sort_no'];
                                                $alias = $subnodes['alias'];
                                                $label = $subnodes['navigation_label'];
                                                $sub_sub_menu_title[] = "<li data-sort='$sort' class='dropdown-submenu'><a href='/$alias' class='dropdown-toggle' data-toggle='dropdown' data-target='#'>$label</a>";
                                                asort($sub_sub_menu_title);
                                                $a = array_unique($sub_sub_menu_title);
                                                var_dump($a);
                                            }
 
                                        }else
                                        {
                                            //subsubmenu
                                            $sort = $subnodes['sort_no'];
                                            $alias = $subnodes['alias'];
                                            $label = $subnodes['navigation_label'];
                                            $sub_sub_menu[] = "<li data-sort='$sort'><a href='/$alias' class='dropdown-toggle' data-toggle='dropdown' data-target='#'>$label</a></li>";
                                            asort($sub_sub_menu);
                                        }
                                        unset($subnodes);
                                    }
                                    $sub_sub_menu_str = "<ul class='dropdown-menu'>";
                                    $sub_sub_menu_str .= implode('', $sub_sub_menu);
                                    $sub_sub_menu_str .= "</ul></li>";
                                    array_push($subMenu, $sub_sub_menu_str);
                                }else{
                                    //submenu
                                    $sort = $nodes['sort_no'];
                                    $alias = $nodes['alias'];
                                    $label = $nodes['navigation_label'];
                                    $subMenu1 = "<li data-sort='$sort'><a href='/$alias' class='dropdown-toggle' data-toggle='dropdown' data-target='#'>$label</a></li>";
                                    array_push($subMenu, $subMenu1);
                                    asort($subMenu);
                                }
                            }
                            unset($nodes);
                        }
                        $mainMenu.= implode('', $subMenu);
                        $mainMenu .="</li></ul>";
                        array_push($lines, $mainMenu);
                    }
                }else{
                    //menu
                    $sort = $node['sort_no'];
                    $alias = $node['alias'];
                    $label = $node['navigation_label'];
                    $lines[] = "<li data-sort='$sort'><a href='/$alias' class='dropdown-toggle' data-toggle='dropdown' data-target='#'>$label</a></li>";
                    asort($lines);
                }
            }
            unset($node);
        }
        asort($lines);
        $menu = implode('', $lines);
        return "<ul>" . $menu . "</ul>";
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.04.2017, 11:59
Ответы с готовыми решениями:

Сокращение при переборе массива foreach
Очень часто вижу в ООП стиле(в классах) такую вот конструкцию: foreach ($this-&gt;vars as $key =&gt; $value) { $$key = $value; } ...

Foreach и дублирование результатов
Приветствую. Прошу помощи. Поискал - то ли не понимаю как искать, то ли в неверных терминах ищу. При переборе массива с помощью...

Принцип работы foreach при переборе элементов управления
Доброго дня, форумчане. Имеется форма с 9 TextBox. В программе необходимо из коллекции внести значения в эти TextBox. Делаю так: ...

2
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
27.04.2017, 12:32
Цитата Сообщение от Jettecs Посмотреть сообщение
уже несколько раз с нуля переписывал
Не в обиду, но видимо вы пишите одну и туже ерунду каждый раз. Почему бы не упростить код? Так и ошибку будет проще искать.

1) unset тут не нужен.
2) от некоторых if можно избавиться так
PHP
1
2
3
4
5
6
7
8
foreach ($nodes['nodes'] as $node) {
    
    if(!$node['is_visible_for_all']) {
        continue;
    }
 
        // остальной код
}
3) разделяем все на методы. Проверка видимости это один метод, рендер секции это другой метод итд...
4) убираем html в шаблон
5) заменяем массив $nodes на объект $nodes
1
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 67
28.04.2017, 16:12  [ТС]
Спасибо, передел с 0 разделил все на методы и пункты не дублируются
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.04.2017, 16:12
Помогаю со студенческими работами здесь

Дублирование данных при выборке данных
Здравствуйте! Использую MariaDB 10.4.8. Есть такой запрос: SELECT skkorz.id,category.Naim,tovar.Naim,skkorz.KolVo,skkorz.idMag FROM...

Избежать дублирование данных при insert
У меня есть БД в ms sql. Там первичный ключ-ID, а есть еще столбец, где содержатся путь к файлам. Как можно при insert данных ограничить...

Дублирование данных при вызове динамической кнопки
Доброго времени суток, у меня есть след. задача: вставлять динамические кнопки и кучу контента в модальное окно. Собственно тестовая...

Дублирование информации при выводе данных - исправить код
Здравствуйте, написал код вывода данных, хочу получить график работы: &lt;?php echo '&lt;th&gt;ФИО &lt;/th&gt;'; echo...

Дублирование данных в DGV при повторном открытии формы
Доброе время суток. Происходит какая -то странность. Код формы Public Class viewer Dim path As String = &quot;dach.mdb&quot;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru