Старый 18.06.2017, 18:04   #1
телочка на авке клевая?
 
Аватар для 10012003
 
Регистрация: 14.09.2008
Адрес: Замкадье.
Сообщений: 1,522
Вес репутации: 261
10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее
По умолчанию Помогите с рекрусией 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)
)
)
10012003 вне форума   Ответить с цитированием
Старый 18.06.2017, 20:41   #2
Эксперт
 
Аватар для Anadonam
 
Регистрация: 29.10.2009
Адрес: Вологда and SSHA
Сообщений: 3,896
Вес репутации: 352
Anadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущее
Отправить сообщение для Anadonam с помощью ICQ
По умолчанию

сорян . я ничо не понял.


у тебя или изначально неправильная структура таблицы:

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. Причина: Добавлено сообщение
Anadonam вне форума   Ответить с цитированием
Старый 18.06.2017, 20:50   #3
телочка на авке клевая?
 
Аватар для 10012003
 
Регистрация: 14.09.2008
Адрес: Замкадье.
Сообщений: 1,522
Вес репутации: 261
10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее
По умолчанию

да нет тут все верно
если 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
10012003 вне форума   Ответить с цитированием
Старый 18.06.2017, 21:04   #4
Эксперт
 
Аватар для Anadonam
 
Регистрация: 29.10.2009
Адрес: Вологда and SSHA
Сообщений: 3,896
Вес репутации: 352
Anadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущее
Отправить сообщение для Anadonam с помощью ICQ
По умолчанию

10012003, поанализируйте подумайте осбенно вот над этим


ЧУЕТЕ ОШИБОЧкОЙ ПАХНЕТ - не +1 как везде а +2

вот непонятная инфа или ошибочка в структуре и всплыла - это виднее только вам (то есть чуть не так преподнесли информацию)

иначе говоря вы этим примером нам мозг вынесли )))))))))))

ошибка вот тут

4 pole1 0
5 pole2 4

в этом месте совершенно непонятно что ты творишь.

люди1 относятся к тест1 а люди4 относятся к людям1
разный сорт людей чтоли )))))

но если разный это нужно как то еще пометить - напрмер еще дополнительным полем. (тогда ты дал инфо неизбыточную)


разберись сам в своем примере ))))))

Последний раз редактировалось Nike99; 18.06.2017 в 21:28. Причина: тсссс без мата
Anadonam вне форума   Ответить с цитированием
Старый 18.06.2017, 21:20   #5
телочка на авке клевая?
 
Аватар для 10012003
 
Регистрация: 14.09.2008
Адрес: Замкадье.
Сообщений: 1,522
Вес репутации: 261
10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее
По умолчанию

поля тестовые, вобще-то это меню
10012003 вне форума   Ответить с цитированием
Старый 19.06.2017, 07:17   #6
Эксперт
 
Аватар для Anadonam
 
Регистрация: 29.10.2009
Адрес: Вологда and SSHA
Сообщений: 3,896
Вес репутации: 352
Anadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущее
Отправить сообщение для Anadonam с помощью ICQ
По умолчанию

оки. все отлично меню.

не ленюсь разжовываю твой пример.


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 минут
Цитата:
если parent == 0 возвращаем результат, в противном случае запускаем рекрусию,
да ну . а если выпадающее меню 4х или 5ти ступенчатое ? а вложенные подменю могут иметь такое же название как корневые меню...
(вот он этот момент помоему у тебя не учитывается и нужна доп проверка )


это вот строка 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. Причина: Добавлено сообщение
Anadonam вне форума   Ответить с цитированием
Старый 20.06.2017, 23:44   #7
телочка на авке клевая?
 
Аватар для 10012003
 
Регистрация: 14.09.2008
Адрес: Замкадье.
Сообщений: 1,522
Вес репутации: 261
10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее
По умолчанию

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 код:
  function get_parent($table,$id$parent_result=[]){
      
$result $this->getRow("SELECT * FROM ?n WHERE id=?i"$table$id);
      if(
$result['parent'] > 0){        
          
$parent_result['menu']=  array_merge($result$parent_result);
        return 
$this->get_parent($table$result['parent'], $parent_result);
      } else {
          return 
array_merge($result$parent_result);
      }
      return 
$result;
  } 
Добавлено через 6 минут
что делает
по уникальному ключу id находит всех родителей , определяемых полем parent соответствующего id родителя, parent == 0 головной элемент, родителей у него нет.
$this->getRow - функция обращения к БД возвращает массив, первую строку результата

Добавлено через 7 минут
Anadonam, собственно вот что должно было получиться, как видите структура базы совсем не важна, тем более не важно, что за что отвечает, но такая структура которую я привел более универсальна, специально для Вас
есть элемент у него 50 подъэлементов, у каждого еще по 50, и вдруг Вам понадобилось сделать этот элемент чей-то подкатегорией, в моем случае меняем parent, а во всех Ваших примерах надо вносить столько изменений что мама не горюй, а теперь если я хочу сменить его головной элемент снова, опять все править или проще парент поменять?

Добавлено через 2 минуты
для большей наглядности
PHP код:
  function get_parent($table,$id$parent_result=[]){
      
$result $this->getRow("SELECT * FROM ?n WHERE id=?i LIMIT 1"$table$id);
      if(
$result['parent'] > 0){        
          
$parent['menu']=  array_merge($result$parent_result);
        return 
$this->get_parent($table$result['parent'], $parent);
      } else {
          return 
array_merge($result$parent_result);
      }
      return 
$result;
  } 

Последний раз редактировалось 10012003; 20.06.2017 в 23:44. Причина: Добавлено сообщение
10012003 вне форума   Ответить с цитированием
Старый 14.07.2017, 04:33   #8
Эксперт
 
Аватар для Anadonam
 
Регистрация: 29.10.2009
Адрес: Вологда and SSHA
Сообщений: 3,896
Вес репутации: 352
Anadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущееAnadonam - прекрасное будущее
Отправить сообщение для Anadonam с помощью ICQ
По умолчанию

Цитата:
Сообщение от 10012003 Посмотреть сообщение
есть элемент у него 50 подъэлементов, у каждого еще по 50, и вдруг Вам понадобилось сделать этот элемент чей-то подкатегорией,
мда . рассмотрение этого вопроса я признаться упустил.
не могу сходу ответить на трудоемкость реализации. по моим примерам.

но зато мой последний пример легко решает вопрос например - показывать какое то подменю всем или только для зарегистрированных пользователяй на сайте.)) а вам если что еще голову почесать как это реализовать... )))

трудно советы давать когда не знаешь цели.
главное что заработало так как вам нужно.
Anadonam вне форума   Ответить с цитированием
Старый 30.07.2017, 21:22   #9
телочка на авке клевая?
 
Аватар для 10012003
 
Регистрация: 14.09.2008
Адрес: Замкадье.
Сообщений: 1,522
Вес репутации: 261
10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее10012003 - прекрасное будущее
По умолчанию

Цитата:
Сообщение от Anadonam Посмотреть сообщение
но зато мой последний пример легко решает вопрос например - показывать какое то подменю всем или только для зарегистрированных пользователяй на сайте.))
Такой задачи не было, да и решается это элементарно, добавляем поле например statys INT(1) и по нему отбираю 0 показываю всем 1 только избранным, можно даже усложнить 2 другим, 3 третьим и тд.

Цитата:
Сообщение от Anadonam Посмотреть сообщение
не могу сходу ответить на трудоемкость реализации. по моим примерам.
а мое решение 1 строчка кода, надо просто сменить парент у элемента.

Просто когда пользуешься чужими готовыми CMS очень много что упускаешь из виду, так как мыслить не шаблонно уже разучился
Цитата:
Сообщение от Anadonam Посмотреть сообщение
трудно советы давать когда не знаешь цели.
Цель я описал, все данные озвучил, а для чего это нужно вообще не имеет никакого значения.
Специально для Вас поясню, если Вам на заводе говорят что нужно помыть пол, значит Вы идете и моете пол, а для каких целей Вас не должно интересовать, так же как и качество вымытых полов не должно меняться от целей уборки.
10012003 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите помогите вставить код в ShopScript Cat_N Вопросы по работе системы 3 22.01.2010 14:35


Часовой пояс GMT +3, время: 16:42.