18.06.2017, 18:04 | #1 |
телочка на авке клевая?
Регистрация: 14.09.2008
Адрес: Замкадье.
Сообщений: 1,522
Вес репутации: 263
|
Помогите с рекрусией php
Всем привет, целый день бьюсь, но что-то не получается,
есть таблица такого вида id name parent 1 test1 0 2 test2 1 3 test3 2 4 pole1 0 5 pole2 4 6 xz 0 где parent это родитель есть данные id=3 надо получить массив вида array( [1]=>array( id=>1, name=>test1, parent=>0, menu=>array( id=>2, name=>test2, parent=>1, menu=>array( id=>3, name=>test3, parent=>2) ) )
__________________
Оргтехника в Алмаате Купить масло для авто в Москве. |
18.06.2017, 20:41 | #2 |
Эксперт
|
сорян . я ничо не понял.
у тебя или изначально неправильная структура таблицы: id уникальный ключ но какой тогда нах массив когда при id 3 возможно вернуть только одно значение. или неправильная хотелка: а если и правильно . то какого хрена там делает 1 test1 0 (ноль) ведь нуля в поле id нет. вот по этому у тебя и нихрена не получается. ------------------- но в принципе подсказать направление путь могу. поищи инфо по ключам - Как правильно реализовать таблицу, отражающую дерево папок. (инфа есть и достаточно) блин я сам уже забыл этот приём.. сорри. ================ Добавлено через 13 минут или использовать дополнительные обработчики на php и вспомогательные переменные при sql запросах. (что ужасно будет тормозить процесс) Добавлено через 10 минут АААА если бы вместо 0 в parent поле содержало бы значение NULL было бы уже проще. или нет . блин я сам хз при такой структуре таблицы. забыл . забыл . сорри забыл. эх . Добавлено через 7 минут ну корень по идее должен быть - дерево не может же расти от ниоткуда оно из земли торчит. 0 (а по правильному 1) земля NULL 1 test1 0 (а по правильному уже будет 2) 2 test2 1 (а по правильному уже будет 3) ........ 4 pole1 0 (а вот момент - а по правильному будет 2) ЧУЕТЕ ОШИБОЧкОЙ ПАХНЕТ - не +1 как везде а +2 вот непонятная инфа или ошибочка в структуре и всплыла - это виднее только вам (то есть чуть не так преподнесли информацию) иначе говоря вы этим примером нам мозг выебли ))))))))))) =================== хотя бы так что ли а там дальше еще развиваем при необходимости..... .......... 10 марс NULL 11 test1 10 12 test2 11 13 qqq1 0 (а по правильному уже будет 1) 14 pole3 2 (а по правильному будет уже "4" - не высчитывал точно) * (а по правильному 1) я просто хз можетли поле id иметь значение 0 по этому поправил чтобы совсем и дуракам понятно было ))) хотя бы уж тогда так. вроде вот так рекурсия будет отлично работать. Добавлено через 14 минут а иначе да - запутался бошку сломал а толку мало . если таблицу изменить уже нельзя - вот тогда php функицими или SQL (что сложно ) нужно вылавливать - если parent = 0 то..... ...... Добавлено через 10 минут ................. Добавлено через 10 минут .......................
__________________
Последний раз редактировалось Anadonam; 18.06.2017 в 20:48. Причина: Добавлено сообщение |
18.06.2017, 20:50 | #3 |
телочка на авке клевая?
Регистрация: 14.09.2008
Адрес: Замкадье.
Сообщений: 1,522
Вес репутации: 263
|
да нет тут все верно
если parent == 0 возвращаем результат, в противном случае запускаем рекрусию, создаем родительский массив, куда записывае текущие значения в menu то есть array ( [parent] => ['menu']=> результат] ) при id =3 надо вернуть массив array( [1]=>array( id=>1, name=>test1, parent=>0, menu=>array( id=>2, name=>test2, parent=>1, menu=>array( id=>3, name=>test3, parent=>2) ) ) по порядку ищем пока parent != 0 в ящейках чей id == parent
__________________
Оргтехника в Алмаате Купить масло для авто в Москве. |
18.06.2017, 21:04 | #4 |
Эксперт
|
10012003, поанализируйте подумайте осбенно вот над этим
ЧУЕТЕ ОШИБОЧкОЙ ПАХНЕТ - не +1 как везде а +2 вот непонятная инфа или ошибочка в структуре и всплыла - это виднее только вам (то есть чуть не так преподнесли информацию) иначе говоря вы этим примером нам мозг вынесли ))))))))))) ошибка вот тут 4 pole1 0 5 pole2 4 в этом месте совершенно непонятно что ты творишь. люди1 относятся к тест1 а люди4 относятся к людям1 разный сорт людей чтоли ))))) но если разный это нужно как то еще пометить - напрмер еще дополнительным полем. (тогда ты дал инфо неизбыточную) разберись сам в своем примере ))))))
__________________
Последний раз редактировалось Nike99; 18.06.2017 в 21:28. Причина: тсссс без мата |
18.06.2017, 21:20 | #5 |
телочка на авке клевая?
Регистрация: 14.09.2008
Адрес: Замкадье.
Сообщений: 1,522
Вес репутации: 263
|
поля тестовые, вобще-то это меню
__________________
Оргтехника в Алмаате Купить масло для авто в Москве. |
19.06.2017, 07:17 | #6 | |
Эксперт
|
оки. все отлично меню.
не ленюсь разжовываю твой пример. 1 test1 0 (корневое меню) 2 test2 1 (вложенное меню в тест 1 или меню которое само может являться корневым меню) 3 test3 2 (вложенная меню в тест 2 или меню которое само может являться корневым меню) 4 pole1 0 (корневое меню) 5 pole2 4 (вложенное меню в pole1 которое само может являться корневым меню ) 6 xz 0 (корневое меню) ну вроде бы всё хорошо. а если мы добавляем еще одно меню. нам что - еще одну таблицу точно такую же делать. # (NULL)меню 1 (назовем например его диск Диск С на компе - если относить к файловой системе) -подменю (корневое меню) -- под под меню --- под под под меню ---- под под под подменю - подменю (корневое меню pole1 0) -- под под меню (обрыв неясность из за названия группы pole ) --- под под под меню (обрыв неясность из названия группы pole ---- под под под под меню (а это и есть само pole2 4 закрывающее группу pole (так как строки pole3 мы в примере не видим и делаем вывод что у группы другие правила в ядре - ушли в черную дыру.....)) - подменю (корневое меню берем по примеру test ) -- под под меню --- под под под меню ---- под под под подменю ЭТО У ТЕБЯ ЕСТЬ #(NULL)меню 2 (назовем например его Диск D на компе если относить к файловой системе) А ВОТ ЭТОГО У тебя НЕТ! ты этого тупо не учитывал вопрос а нахуа ?. ведь все это можно реализовать и в одной таблице ! а у тебя это не реализовано - ОШИБКА. вот еще раз повторюсь - этот неучет и создает тебе геморрой. Добавлено через 12 минут посиди поразбирайся полезно будет - а потом станет легче дышать Добавлено через 8 минут =========================================== ну плять - ну если и это не понятно. объясняю опять для самых тупых. хорошо учел диски С Д Е . к них корень винчестер. но и винчесторов может быть 4 всегда нужно цепляться за корень - у тебя их 3 вопрос - где они растут. ? берем корень сайт - у сайтов может быть 2 типа меняю горизонтальное и вертикальное (а у тебя их 3 - блять опять ошипка - какой третий тип ты имел в виду ?)))))) то что идея общая тоже не подходит - плять цифра 3 - оки под 3 сайта. -оки значит чевертый ты делать не планируешь......)))))) тогда всё ровно. но сцуко и 2 делать нельзя а то работать не будет. вот возможный вариант я тебе нарисовал выше единтвеннно годный под твою структуру. вкуривай это. Добавлено через 11 минут ................. Добавлено через 13 минут Добавлено через 10 минут =========================== Поскриптум ну что трудно что ли было создать строку в таблице 1 koren1 0 2 test1 1 3 test 2 2 ..... ..... и забыть про id = 1 и забыть про Parent = 0 ну хотя бы так - хотя это вариант для самых тупых школьников и всё бы заработало без геморра но нет же = ты упорно ссылаешься на id 0 причем путаясь в цифрах и ебя мозги и себе и другим )))) ох ....... ... .. ......... вот теперь сиди проверяй сколько у тебя меню на сайте и каких горизонтальных или вертикальных. (я бы просто до такого не додумался разрабатывая таблицу))) =========================================== хотелка не реальная в твоем примере вполне может быть что id=>1, name=>test1, parent=>0, menu=>array( id=>2, name=>test2, parent=>1, menu=>array( id=>3, name=>test2, parent=>2, menu=>array( id=>4, name=>pole1, parent=> (блин туплю уже 3 или 0 но не важно - тут ты проверяешь на ноль но этого мало нужен еще фильтры и сам видишь не факт что проверка вообще может дойти до этого места так как id уже = 4 ! (тупиво)), menu=>array(вот опять этот косяк всплывает) тут надо ставить фильтр. выяснять - чем test1 или xz (понял фишку ? 2 проверки - а может быть и больше) отличается от pole1. просто если parent == 0 не достаточно (по причине что делать 2 одинаковых корневых папки на диске С нельзя)(2 корневых меню с одинаковым названием на сайте можно) = тупиво (по этому я и указал в примере структуры неяснсть по причине группы pole - нужно выяснить цели и назначение в чем отличия от остальных групп - я этого не знаю !) ) . ВОТ В ЭТОМ вот месте ТВОЯ ОШиБКА ОШИБОЧНОГО МЫШЛЕНИЯ id=>5, name=>test2, parent=>4, menu=>array( id=>6, name=>test3, parent=>5 ..... ..... (тут нужна будет доп сортировка) Добавлено через 2 минуты =============================== ну кто тут сядет голову ломать помогать......... Добавлено через 2 минуты сорри аж сам наошибался помоему от непоняток ...... )) в общем вот эта фишечка хотелка твоя menu=>array( исходя из приведенных данных не работает вообще. Добавлено через 22 минуты не понял как понимать вот это id=>3, name=>test3, parent=>2) это типа папка для чтения которая не может содержать подменю ?????? почему тут нет menu=>array( ??? - и чем тогда заполнять первый массив. ??? бррррррр. всёё. мозги заплавились. Добавлено через 7 минут Цитата:
(вот он этот момент помоему у тебя не учитывается и нужна доп проверка ) это вот строка pole1 0 и косячит а pole2 прыгает на саму себя НО она не test 5 (отличная от группы test) - и начинается непонятно что в этом месте (прогале) должно происходить. это можешь знать только ты и тут тебе вряд ли кто поможет. так как вариантов десятки. (черная дыра - не понятно чего ты там ваяешь))))) уф. накатал кое как )))) ///////////////////////////////////////////////////////////////////////////////// на всякий случай перечитал 2 раза - лично я сам понял чего написал . если будет все равно не понятно сорри . больше ничего подсказать не могу ))) Добавлено через 1 час 22 минуты ================================= ну пока еще перекур и может еще как то поможет. еще про корни в бД и вот такие вот штуки чтбы как то это упростить и не компсировать себе мозг создают вспомогательные таблицы. (ну например код создавал другой программист а ты в этом нихрена не понял и тебе нужно добавить что то. варинт тоже годный просто все равно если условия ""но .... "" которые нужно убедится проверить чтобы не накосячить ) например корень винчестер 1 винчестер1 1 2 винчестер2 2 3 винчестер3 3 4 винчестер4 4 5 резерв1 5 6 резерв2 6 ........... если корень сайт 1 сайт1 1 2 сайт2 2 ..... ..... если корень меню на сайте 1 горизонтальное меню 1 2 вертикальное меню 2 3 резерв 3 а к таблице добавляют вспомогательное поле в зависимости от нужного корня. id name parent винчестер 1 test1 0 1 2 test2 1 1 3 test3 2 1 4 pole1 0 2 5 pole2 4 2 6 xz 0 3 таким образом сильно упрощаем себе жизнь в конкретном твоем случае таблица 1 id name описание 1 test коневая папка которая может быть ссылкой и содержать вложенные папки без ограничения. 2 pole корневая папка которая может быть ссылкой содержать вложенные папки но всего 2 штуки (обрати внимание на это) 3 xz корневая папка которая может быть корневая папка которая может быть ссылкой содержать вложенные 2 подпапки которые в свою очеред могут содержать не более 10 по под папок (обрати внимание на это) 4 полный xз корневая папка только для чтения не может являться ссылкой (просто для чтения) 5 ne xz корневая папка со всеми возможностями вообще без огранечений вложенности таблица 2 id name parent корень_id 1 test1 0 1 2 test2 1 1 3 test3 2 1 4 pole1 0 2 5 pole2 4 2 6 xz 0 5 алгоритм вывод в массив данных когда уже может идти рекурсия по таблеце 2 например условие что parent==0 делаешь проверку . если parent==0 то идем в цикл где если корень_id == 5 то рекурсия для корень 5 если корень_id == 1 то рекурсия где корень 1 если корень_id == 2 проверяем а не заблудились ли мы чтобы делать рекурсию может она тут и не нужна если корень_id == 4 на экран ее вывести если нужно, но вообще запретить кликать по этой папке .......... и так далее и тому подобное. если идет рекурсия по таблице 2 находим условие, чтобы завершить общую рекурсию по таблице 2 при условии parent==0 оно само перестанет выводится в массив вот тебе реализация твоего хотения = но больше чем 3 строки в основной массив ты не получишь - вернее их всегда будет 3 - но тогда какой смысл делать запрос когда можно тупо константами забить массив. и это будет работать в 10 раз быстрее. чем весь этот геморр. (и не уверен что тут можно обойтись без значения NULL - это как дополнительная проверка - те фильтры про которых я кричал выше и ругался на pole2 в твоем примере. если бы ты сразу написал примерную таблицу: 1 test 0 2 test1 1 3 test2 2 4 test3 2 5 pole 0 6 pole1 5 7 xz 0 мне бы было гораздо проще понять и подсказать а то я потратил .ля 2 часа на перекурах чтобы это написать )) да и тебе самому было бы проще понять где ты ошибаешься и вопрос бы не возник собственно. всем доброе утро а я спать.......
__________________
Последний раз редактировалось Anadonam; 19.06.2017 в 07:24. Причина: Добавлено сообщение |
|
20.06.2017, 23:44 | #7 |
телочка на авке клевая?
Регистрация: 14.09.2008
Адрес: Замкадье.
Сообщений: 1,522
Вес репутации: 263
|
Anadonam, спасибо конечно за столь подробное разъяснение, но Вы увы так ничего и не поняли.
Вот нафига мне выкладывать полностью всю структуру таблицы? Я написал только самое необходимое, я не просил учить меня строить таблицы, с ними все в порядке и я в них всю учел, вместо всего того что Вы написали нужна была 1 функция например, она не рабочая function test($id, $parent){ $query = запрос к базе, вернет массив [id=>3, name=>test3, parent=>2] $parent = ['menu'=>$query] if($query['parent']>0) return test($query['parent'], $parent; else return $query; ) Вот тут ошибка, а не в структуре Есть задача, ее надо решить, какая разница, где что обозначает и за что отвечает, имеет правильную структуру или ошибочную, задачи это не решает. Добавлено через 5 минут насчет агоритма, прям проще некуда проверяем parent если > 0 это дочерний элемент, его родитель находится в id=parent? соответственно в родителе должно быть поле menu которое включает данный массив, и так далее пока parent != 0 при parent == 0 выводим то что получилось Добавлено через 50 минут Ура разобрался, может кому интересно будет PHP код:
что делает по уникальному ключу id находит всех родителей , определяемых полем parent соответствующего id родителя, parent == 0 головной элемент, родителей у него нет. $this->getRow - функция обращения к БД возвращает массив, первую строку результата Добавлено через 7 минут Anadonam, собственно вот что должно было получиться, как видите структура базы совсем не важна, тем более не важно, что за что отвечает, но такая структура которую я привел более универсальна, специально для Вас есть элемент у него 50 подъэлементов, у каждого еще по 50, и вдруг Вам понадобилось сделать этот элемент чей-то подкатегорией, в моем случае меняем parent, а во всех Ваших примерах надо вносить столько изменений что мама не горюй, а теперь если я хочу сменить его головной элемент снова, опять все править или проще парент поменять? Добавлено через 2 минуты для большей наглядности PHP код:
__________________
Оргтехника в Алмаате Купить масло для авто в Москве. Последний раз редактировалось 10012003; 20.06.2017 в 23:44. Причина: Добавлено сообщение |
14.07.2017, 04:33 | #8 | |
Эксперт
|
Цитата:
не могу сходу ответить на трудоемкость реализации. по моим примерам. но зато мой последний пример легко решает вопрос например - показывать какое то подменю всем или только для зарегистрированных пользователяй на сайте.)) а вам если что еще голову почесать как это реализовать... ))) трудно советы давать когда не знаешь цели. главное что заработало так как вам нужно.
__________________
|
|
30.07.2017, 21:22 | #9 | |
телочка на авке клевая?
Регистрация: 14.09.2008
Адрес: Замкадье.
Сообщений: 1,522
Вес репутации: 263
|
Цитата:
а мое решение 1 строчка кода, надо просто сменить парент у элемента. Просто когда пользуешься чужими готовыми CMS очень много что упускаешь из виду, так как мыслить не шаблонно уже разучился Цель я описал, все данные озвучил, а для чего это нужно вообще не имеет никакого значения. Специально для Вас поясню, если Вам на заводе говорят что нужно помыть пол, значит Вы идете и моете пол, а для каких целей Вас не должно интересовать, так же как и качество вымытых полов не должно меняться от целей уборки.
__________________
Оргтехника в Алмаате Купить масло для авто в Москве. |
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Помогите помогите вставить код в ShopScript | Cat_N | Вопросы по работе системы | 3 | 22.01.2010 14:35 |
Часовой пояс GMT +3, время: 14:00.