[php] return и рекурсивная функция

12
_S
На сайте с 11.01.2006
Offline
150
2566

Приветствую.

Код


function ShowTreeWithCat($ParentID, $lvl,$mod='',$tree='') {
global $my_link;
global $lvl;

$lvl++;

$sSQL = "SELECT * FROM cat_category WHERE pid = " . $ParentID . " and status='yes' ORDER BY sort";

$result = mysql_query($sSQL, $my_link);

if (mysql_num_rows($result) > 0)
{
$tree.=("<UL>\n");
while ( $row = mysql_fetch_array($result) )
{
$ID1 = $row["id"];
$tree.=("<LI>\n");
$tree.=("<A title=\"$row[title]\" HREF=\"" . "index.php?mod=cat&lmod=category&id=" . $ID1 . "\"><b>" . $row["title"] . "</b></A>" . "&nbsp;&nbsp;\n");

$resultA = mysql_query("SELECT id,title,status,sort,pid FROM cat_content WHERE pid=$row[id] and status='yes' order by sort",$my_link);
if (mysql_num_rows($resultA) > 0)
{
$tree.= "<ul>\n";
if ($myrowA = mysql_fetch_array($resultA))
do
{
$tree.= "<li><a title=\"Редактировать товар\" href=\"index.php?mod=cat&lmod=content&id=$myrowA[id]\">$myrowA[title]</a></li>";
}
while ($myrowA = mysql_fetch_array($resultA));
$tree.= "</ul>\n";
}
ShowTreeWithCat($ID1, $lvl,$mod,$tree);
$lvl--;
}
$tree.=("</UL>\n");
}
return $tree;
}

Ситуация: при вызове рекурсивной функции и выводе данных в функцие через оперетор "echo" всё прекрасно работает. Но если я хочу все данные положить в переменную и после завершения функции вернуть значение через return, то данные из части кода


$resultA = mysql_query("SELECT id,title,status,sort,pid FROM cat_content WHERE pid=$row[id] and status='yes' order by sort",$my_link);
if (mysql_num_rows($resultA) > 0)
{
$tree.= "<ul>\n";
if ($myrowA = mysql_fetch_array($resultA))
do
{
$tree.= "<li><a title=\"Редактировать товар\" href=\"index.php?mod=cat&lmod=content&id=$myrowA[id]\">$myrowA[title]</a></li>";
}
while ($myrowA = mysql_fetch_array($resultA));
$tree.= "</ul>\n";
}

не попадают в переменную

Revolve - создание сайтов (http://www.revolving.ru/) icq 55-61-51
K
На сайте с 12.07.2006
Offline
295
Kpd
#1
__SPiRiT__:
не попадают в переменную

Не понял, зачем передавать во внутреннюю рекурсию $tree,, её тебе нужно только встречать. Попробуй в рекурсивном вызове вместо

ShowTreeWithCat($ID1, $lvl,$mod,$tree);

написать

$tree .= ShowTreeWithCat($ID1, $lvl,$mod);

а в начале функции поставь на всякий случай $tree = "";

выводе данных в функцие через оперетор "echo" всё прекрасно работает.

Если не разберешься с переменными, то есть ещё один способ (будет работать 100%, но метод тормозной и кривой :)). Можно перед вызовом функции сделать кэширование вывода (для поиска ключевое слово ob_start), после функции забрать весь буфер в переменную и очистить кэш.

_S
На сайте с 11.01.2006
Offline
150
#2

Kpd, попадает в вечный цикл если сделать замену

почему все данные сохраняются, кроме тех которые во втором запросе в функции?

K
На сайте с 12.07.2006
Offline
295
Kpd
#3
__SPiRiT__:
Kpd, попадает в вечный цикл если сделать замену

Это не может влиять на зацикливание, что-то ещё изменил.

__SPiRiT__:
почему все данные сохраняются, кроме тех которые во втором запросе в функции?

Потому что криво работаешь в переменными.

Я не понимаю какую роль у тебя играют параметры, передаваемые в функцию. Там достаточно только одной переменной - ID родительского раздела.

T
На сайте с 23.10.2005
Offline
60
#4

попробуйте сделать переменную ссылочной - &$tree, а от return совсем оказаться.

это хороший способ - будет работать.

[Удален]
#5
topol:
это хороший способ - будет работать.

Это хороший способ если делать по типу "лишь бы работало", однако желательно именно разобраться как оно работало бы, что не работает, почему не работает...

(не окуратный код одна из главных причин дыр в безопасности)

K
На сайте с 12.07.2006
Offline
295
Kpd
#6
topol:
попробуйте сделать переменную ссылочной - &$tree, а от return совсем оказаться.
это хороший способ - будет работать.

Аналогично будет работать объявление $tree глобальной переменной (и по сути это аналогично передаче по ссылке), но тоже некрасивый способ.

T
На сайте с 23.10.2005
Offline
60
#7
Зингельшухер:
Это хороший способ если делать по типу "лишь бы работало", однако желательно именно разобраться как оно работало бы, что не работает, почему не работает...
(не окуратный код одна из главных причин дыр в безопасности)

не то пишите -

1. у вас рекурсивный вызов не присваивает ничего ни какой переменной, а сама функия возврашает значение.

2. я вам дал совет, а использовать его или нет - дело ваше.

3. неаккуратный код и мой совет никак не соприкасаются, так что и безопасность тут не причем.

4. если эта функция совсем кривая - лучше напишите свою.

я не разбирался в тонкостях этой проги, я дал лишь совет как иногда полезно обойти трудности с возвратом функции при рекурсии. Или вы хотите, что-бы вам ее написали?

_S
На сайте с 11.01.2006
Offline
150
#8
Kpd:
Это не может влиять на зацикливание, что-то ещё изменил.


Потому что криво работаешь в переменными.
Я не понимаю какую роль у тебя играют параметры, передаваемые в функцию. Там достаточно только одной переменной - ID родительского раздела.

Написал, что я кривой - так напиши плиз ещё и где. А про лишние переменные, так они работают, а в рамках этого форума я их исключил из кода.

Всё вышепредложенное не работает (((((((((((((((

K
На сайте с 12.07.2006
Offline
295
Kpd
#9
__SPiRiT__:
Написал, что я кривой - так напиши плиз ещё и где.

Ещё раз

return $tree;

Ты возвращаешь из рекурсии какое-то накопленное значение (вернее хочешь вернуть), но не делаешь его сохранение в точке вызова

ShowTreeWithCat($ID1, $lvl,$mod,$tree);

Поставь здесь присваивание и всё.

_S
На сайте с 11.01.2006
Offline
150
#10


function ShowTreeWithCat($ParentID, $lvl,$mod,$tree) {
global $my_link;
global $lvl;

$lvl++;

//echo $tree."<br>";

$sSQL = "SELECT * FROM cat_category WHERE pid = " . $ParentID . " and status='yes' ORDER BY sort";

$result = mysql_query($sSQL, $my_link);

if (mysql_num_rows($result) > 0)
{
$tree.=("<UL>\n");
while ( $row = mysql_fetch_array($result) )
{
$ID1 = $row["id"];
$tree.=("<LI>\n");
$tree.=("<A title=\"$row[title]\" HREF=\"" . "index.php?mod=cat&lmod=category&id=" . $ID1 . "\"><b>" . $row["title"] . "</b></A>" . "&nbsp;&nbsp;\n");

$resultA = mysql_query("SELECT id,title,status,sort,pid FROM cat_content WHERE pid=$row[id] and status='yes' order by sort",$my_link);
if (mysql_num_rows($resultA) > 0)
{
$tree.= "<ul>\n";
if ($myrowA = mysql_fetch_array($resultA))
do
{
$tree.= "<li><a title=\"Редактировать товар\" href=\"index.php?mod=cat&lmod=content&id=$myrowA[id]\">$myrowA[title]</a></li>";
}
while ($myrowA = mysql_fetch_array($resultA));
$tree.= "</ul>\n";
}
ShowTreeWithCat($ID1, $lvl,$mod,$tree);
$lvl--;
}
$tree.=("</UL>\n");
}
return $tree;
}

щас выглядит вот так и не работает

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий