Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопрос по рекурсии.

74K
25 ноября 2011 года
LegGnom
5 / / 11.11.2011
Пытаюсь сделать рекурсию для вывода пути.

 
Код:
function path($id){
    $sql = mysql_query("SELECT * FROM bdconfig WHERE id=".intval($id));
    $row = mysql_fetch_assoc($sql);
    if($row > 0){
        $path_arr[] = $row['parent'];
        path($row['parent']);
    }else{return $path_arr;}
}

скидываю все данные в массив и после этого хочу инфертнуть его для правильного построения и вывести. но при вызове функции var_dump дает значение NULL

строение в базе такое

id | parent |
----------------
1 | 0 |
2 | 1 |
3 | 1 |
4 | 3 |

итд... может кто подскажет почему так получается?
1
25 ноября 2011 года
kot_
7.3K / / 20.01.2000
а как по твоему должно получаться? Попробуй словами проговори то что ты пытаешься сделать. Не забывая о таких мелочах как области видимости, инициализация и пр.
З.Ы. Кстати формирование запроса в рекурсивной функции - это не очень хорошая идея. но это так к слову.
244
25 ноября 2011 года
UAS
2.0K / / 19.07.2006
Изучите Nested Set. Примеры в гугле есть и реализуете задачу сразу правильно и как надо.
Этот вариант уже плох только тем, что на каждый вызов функции происходит sql-запрос.
4
25 ноября 2011 года
mike
3.7K / / 01.10.2002
Цитата: UAS
Изучите Nested Set. Примеры в гугле есть и реализуете задачу сразу правильно и как надо.
Этот вариант уже плох только тем, что на каждый вызов функции происходит sql-запрос.



Много SQL запросов не значит плохо. А вот медленный SQL запрос - плохо.

4
25 ноября 2011 года
mike
3.7K / / 01.10.2002
Проблема в том что $path_arr внутри каждого вызова функции свой. В данном конкретном примере можно использовать или глобальную переменную или сразу вывод.

Стоит попробовать Nested Set. Но в такой задаче под вопросом. Нужно экспермементировать с готовой базой данных. Все зависит от глубины рекурсии, структуры данных, индексов и возможности кеширования.
74K
26 ноября 2011 года
LegGnom
5 / / 11.11.2011
а если переменную $path_arr сделать статичной тоесть так

function path($id){
static $path_arr;
...
12
27 ноября 2011 года
alekciy
3.0K / / 13.12.2005
Цитата: UAS
Изучите Nested Set. Примеры в гугле есть и реализуете задачу сразу правильно и как надо.
Этот вариант уже плох только тем, что на каждый вызов функции происходит sql-запрос.


Не обязательно плох. Вопрос решаемый. Варианты на вскидку: хранимые процедуры, рекурсивные запросы (в смысли силами самой СУБД).

12
27 ноября 2011 года
alekciy
3.0K / / 13.12.2005
Цитата: LegGnom

итд... может кто подскажет почему так получается?


Потому что $path_arr это локальная переменная существующая только в рамках текущего вызова функции path. Ты рекурсивно вызвал path($row['parent']), но не передал в него предыдущий собранный путь,. Поэтому при каждом вызове в $path_arr пишется $row['parent'] только текущего id, но это ни как не влияет на получение общего результата.

Добавь второй параметр и передавай его по ссылке, т.е. path($id, & $path_arr).

12
27 ноября 2011 года
alekciy
3.0K / / 13.12.2005
Цитата: LegGnom
а если переменную $path_arr сделать статичной тоесть так

function path($id){
static $path_arr;
...


Ни секунды не связанные понятия в данном контексте. Курить доки до полного понимая:
Ключевое слово "static"
PHP ООП

14
28 ноября 2011 года
Phodopus
3.3K / / 19.06.2008
Насколько я понял задачу, статической переменой все же можно воспользоваться. Хотя может быть сие не совсем идеологически верно.
12
28 ноября 2011 года
alekciy
3.0K / / 13.12.2005
Цитата: Phodopus
Насколько я понял задачу, статической переменой все же можно воспользоваться. Хотя может быть сие не совсем идеологически верно.


Ты не уловил. Посмотри код еще раз. Её там не может быть потому что её там не может быть. И не в идеологии дело.

443
28 ноября 2011 года
REmindER
292 / / 23.03.2003
Может, сделать так:

Код:
function path($id, & $path_arr = array())
    {
    $sql = mysql_query("SELECT * FROM bdconfig WHERE id=".intval($id));
    $row = mysql_fetch_assoc($sql);
    if($row > 0)
        {
        $path_arr[] = $row['parent'];
        path($row['parent'], $path_arr);
        }
    else
        return $path_arr;
}

...

print_r(path(0));
14
28 ноября 2011 года
Phodopus
3.3K / / 19.06.2008
Цитата: alekciy
Ты не уловил. Посмотри код еще раз. Её там не может быть потому что её там не может быть. И не в идеологии дело.


Статические только для классов?

12
28 ноября 2011 года
alekciy
3.0K / / 13.12.2005
Цитата: Phodopus
Статические только для классов?


В PHP со статическими не просто, но да, они для классов.

287
28 ноября 2011 года
Shiizoo
958 / / 14.03.2004
Давно не встречал статических переменных в функциях в PHP, но они по сей день в языке есть:

 
Код:
E:\usr\Console2>E:\usr\Console2>php -r "function a() { static $b = '1' ; $b .= '1'; echo $b . PHP_EOL; } a(); a(); a(); echo PHP_VERSION;"
11
111
1111
5.2.14
12
28 ноября 2011 года
alekciy
3.0K / / 13.12.2005
Цитата: Shiizoo
Давно не встречал статических переменных в функциях в PHP, но они по сей день в языке есть


Ну я про это и говорю, что там с ними не все так просто. Однако это не повод писать такой моветон.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог