Где ошибка?
Сейчас заносит в массив только одного (первого) родителя...
Мелкий
Отправлено: 24 Августа, 2011 - 14:26:30
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Вы ничего не делаете со значением, которое вызывает рекурсивная функция.
----- PostgreSQL DBA
Kubert
Отправлено: 24 Августа, 2011 - 14:31:52
Частый гость
Покинул форум
Сообщений всего: 186
Дата рег-ции: Февр. 2010
Помог: 3 раз(а)
Мелкий
Как же?
Я ищу в многомерном массиве $fintParent его родителя и добавляю в массив $listId значение $idObject
вот вроде: $listId[] = $fintParent[$id]['pid'];
Разве нет? А потом снова вызываю эту функцию но с уже id родителя и так до бесконечности пока родитель не будет равен "0"
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Kubert, не знаю, что вы там предполагаете, но в объявлении функции вы полностью игнорируете то, что вернула рекурсивная функция.
----- PostgreSQL DBA
Kubert
Отправлено: 24 Августа, 2011 - 15:24:15
Частый гость
Покинул форум
Сообщений всего: 186
Дата рег-ции: Февр. 2010
Помог: 3 раз(а)
Мелкий
Что же она вернула и как я игнорирую это... Можете пояснить?
DeepVarvar
Мне из предыдущей функции(ее здесь нет), известен только id который я передаю в этой функции. А эта функция мне как раз помогает найти всех предков этого id...
Я явно запутался
Мелкий
Отправлено: 24 Августа, 2011 - 16:52:23
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Kubert пишет:
строка 5: find($fin...
Тогда как функция результат своей работы возвращает через return. Т.о. отрабатывает зря.
----- PostgreSQL DBA
Champion
Отправлено: 24 Августа, 2011 - 16:56:24
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
Мелкий пишет:
вы полностью игнорируете то, что вернула рекурсивная функция.
Ну в принципе можно это и игнорировать. Здесь выход происходит не по возвращаемому значению, а по переданному параметру - это тоже жизнеспособно.
Kubert, ошибка в том, что измененкения, произошедшие во внутренних find() не отражаются во внешней. Нужно либо $listId передавать по ссылке, либо возвращать его и пользоваться
Kubert
Отправлено: 24 Августа, 2011 - 17:17:50
Частый гость
Покинул форум
Сообщений всего: 186
Дата рег-ции: Февр. 2010
Помог: 3 раз(а)
Champion
Не понимаю...
Мог бы ты привести код для данного примера.
Я же перед тем как вызвать внутренний find() присваиваю значение массиву...
А потом при запуске find() передаю его дальше и так пока функция не дойдет до конца.
Т.е. массив постоянно новый должен передаваться в функцию...
А когда функция закончина, то уже полностью сформированный массив передаю "ретурном".
Разве не так?
Champion
Отправлено: 24 Августа, 2011 - 18:23:53
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
Kubert пишет:
Мог бы ты привести код для данного примера.
Проще всего в объявлении функции поставить & перед последним параметром.
Kubert пишет:
Я же перед тем как вызвать внутренний find() присваиваю значение массиву...
да...
Kubert пишет:
А потом при запуске find() передаю его дальше и так пока функция не дойдет до конца.
Т.е. массив постоянно новый должен передаваться в функцию...
тоже да...
Kubert пишет:
А когда функция закончина, то уже полностью сформированный массив передаю "ретурном".
А тут нет. Полностью сформированный массив будет только внутри самой внутренней функции. Для более внешней функции массив останется без изменений. Ретурном вы его не передаете. Значение функции ничему не присваивается.
Чтоб понять что как происходит, напишите, напримеp var_dump($listId) до и после внутреннего вызова find и посмотрите, что выводит. Только не спутайте вывод того что до и того, что после, а то сделаете не те выводы
DeepVarvar
Отправлено: 24 Августа, 2011 - 18:24:06
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
Kubert я вот не понимаю зачем делать потом лишний цикл?
Ну вот сформировали мы этот промежуточный массив со всеми вложенностями.
И что дальше? При выводе еще раз перебирать с условиями?
Нафига? Перебирайте один раз - сразу в результирующую хтмл-разметку ул ли или что там будет... (Добавление)
У Вас в начале ф-ции find() находился код: $listId = array(); Этого нельзя делать, вы при кадой рекурсии обнуляли массив. Код набросал на быструю руку, могут быть ошибки.
Покинул форум
Сообщений всего: 16
Дата рег-ции: Авг. 2011
Помог: 0 раз(а)
DeepVarvar пишет:
egir пишет:
//Запрос к БД, чтобы достать инфу о текущей категории
Оооо!!!! А если их 200 или 300 ???
Ну человеку требовался именно массив. Я для таких случаев делаю таблицу, в которой содержатся все возможные связи от родителя к потомкам и потом одним запросом достаю все что мне надо. Правда при добавлении новой записи приходится переформировывать таблицу дерева связей, но лучше один раз. Хотя если в таблицах проставить индексы по айдишникам и так все будет летать.
DeepVarvar
Отправлено: 25 Августа, 2011 - 00:05:49
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
Так мой пример разбирает весь массив из одного запроса по вложеностям и ничего не нужно будет при добавлении нового пункта переформировывать.
Зачем крутить лишние циклы и запросы?
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.