Вопрос по рекурсии.
$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 |
итд... может кто подскажет почему так получается?
З.Ы. Кстати формирование запроса в рекурсивной функции - это не очень хорошая идея. но это так к слову.
Этот вариант уже плох только тем, что на каждый вызов функции происходит sql-запрос.
Этот вариант уже плох только тем, что на каждый вызов функции происходит sql-запрос.
Много SQL запросов не значит плохо. А вот медленный SQL запрос - плохо.
Стоит попробовать Nested Set. Но в такой задаче под вопросом. Нужно экспермементировать с готовой базой данных. Все зависит от глубины рекурсии, структуры данных, индексов и возможности кеширования.
function path($id){
static $path_arr;
...
Этот вариант уже плох только тем, что на каждый вызов функции происходит sql-запрос.
Не обязательно плох. Вопрос решаемый. Варианты на вскидку: хранимые процедуры, рекурсивные запросы (в смысли силами самой СУБД).
итд... может кто подскажет почему так получается?
Потому что $path_arr это локальная переменная существующая только в рамках текущего вызова функции path. Ты рекурсивно вызвал path($row['parent']), но не передал в него предыдущий собранный путь,. Поэтому при каждом вызове в $path_arr пишется $row['parent'] только текущего id, но это ни как не влияет на получение общего результата.
Добавь второй параметр и передавай его по ссылке, т.е. path($id, & $path_arr).
function path($id){
static $path_arr;
...
Ни секунды не связанные понятия в данном контексте. Курить доки до полного понимая:
Ключевое слово "static"
PHP ООП
Ты не уловил. Посмотри код еще раз. Её там не может быть потому что её там не может быть. И не в идеологии дело.
{
$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));
Статические только для классов?
В PHP со статическими не просто, но да, они для классов.
11
111
1111
5.2.14
Ну я про это и говорю, что там с ними не все так просто. Однако это не повод писать такой моветон.