Forum Webscript.Ru

Программирование => PHP => Тема начата: DimoninG2 от 15 Июля 2006, 23:55:30

Название: Функция не возвращает значение.
Отправлено: DimoninG2 от 15 Июля 2006, 23:55:30
Ребята, странная проблема.

Есть функция, которая не может возвратить значение (возвращается всегда "").

Вот код:


function get_inside($id, $ins){

$q = mysql_query ("SELECT * FROM CAT WHERE ID=\'$id\';");
if (!$q){
echo "error";
exit(0);
}
$str = mysql_fetch_array ($q);
if ($str[\'parent\'] <= \'0\'){
/*ошибка тут!*/ return $ins;
}
else{
$ins++;
get_inside ($str[\'parent\'], $ins);
}


}

function get_inside_and_print($id){
echo get_inside (13, 0)."
";
}



На алгоритм не смотрите - он правильный. Дело в том, что если вместо return $ins; поставить echo $ins; то все работает (значение выводится). Ощущение, что return не может передать данные в теле if...

В чем дело и как лечить?
Название: Функция не возвращает значение.
Отправлено: Altaxar от 16 Июля 2006, 02:00:35
Как я понял, сдесь рекурсия и при $str[\'parent\'] >0 он заходит дальше,  что ты делаеш с получиным значением? думаю тебе надо изменить так:
return get_inside ($str[\'parent\'], $ins);
Название: Функция не возвращает значение.
Отправлено: DimoninG2 от 16 Июля 2006, 02:29:57
return get_inside ($str[\'parent\'], $ins);

Но мне не нужно, чтобы после того как произойдет ретурн функция вызывалась еще раз...

Насчет полученного значения.

У меня есть меню (для сайта), которое составляется динамически. В каждый пункт меню можно неограниченно вложить еще пункты. В каждый под-пункт еще и так далее - то есть меню ни где не ограниченно.

Так вот этой рекурсивной функцией я нахожу степень вложенности переданного id меню. То есть, когда достигается корень (самый верхний уровень), счетчик $ins равен степени вложенности и его-то мне и нужно возвратить.

А уже по степени вложенности определяется оформление текста для вывода на страницу.

Если есть вариант использования глобальной переменной - расскажите как, а то не выходит че-то.
Название: Функция не возвращает значение.
Отправлено: Altaxar от 16 Июля 2006, 02:50:53
Цитировать
Но мне не нужно, чтобы после того как произойдет ретурн функция вызывалась еще раз...


я то понял как работает этот алгоритм и для чего, ты всетаки поставь перед той строчкой return и посмотри результат :)

Цитировать
Если есть вариант использования глобальной переменной - расскажите как, а то не выходит че-то.


$max=0;
 function get_inside($id,$ins){
  global $max;
 ...
..
      $max=$ins  // за место  return $ins;
...
}

P.S. Почитай, что такое рекурсия и как она работает.