Всем здрасьте! Столкнулся с такой проблемой. У меня есть рекурсивная функция, которая выводит дерево. Все хорошо было до тех пор, пока мне не пришлось воспользоваться ajax. Выяснилось, что вывод данных из функции производившийся при помощи echo после обработки ajax выдает данные немного не в том формате. Опустив детали, скажу, что поменяв echo на переменную, организовав дописываение переменной к себе самой и выводом данных из функции return-ом, я получил эти же данные, но в обратном порядке... Я так и не могу понять, как мне организовать вывод данных из функции при помощи return так же как при помощи echo. Может мне кто-нибудь объяснит, в чем моя ошибка и как ее исправить? Вот данные, поступающие в функцию в переменной $tree: Array ( [0] => Array ( [1] => Демонтажные работы [2] => Строительные работы ) [1] => Array ( [3] => Демонтаж стен и перегородок [4] => Демонтаж инженерных сетей ) [2] => Array ( [5] => Фундамент [6] => Коробка дома ) ) сама функция с выводом echo: PHP: function ShowTree1($tree, $pid=0){ echo " <ul class='rabota' id='catal_rabot_".$pid."'>".PHP_EOL; foreach ($tree as $id => $root) { if($pid!=$id)continue; if(count($root)) { foreach($root as $key => $title) { echo" <li><em id=cat_rab_".$key.">".$title."</em></li>".PHP_EOL; if(count($tree)){ ShowTree1($tree,$key); } } } } echo " </ul>".PHP_EOL; } Результат который меня устраивает: HTML: <ul class='rabota' id='catal_rabot_0'> <li><em id=cat_rab_1>Демонтажные работы</em></li> <ul class='rabota' id='catal_rabot_1'> <li><em id=cat_rab_3>Демонтаж стен и перегородок</em></li> <ul class='rabota' id='catal_rabot_3'> </ul> <li><em id=cat_rab_4>Демонтаж инженерных сетей</em></li> <ul class='rabota' id='catal_rabot_4'> </ul> </ul> <li><em id=cat_rab_2>Строительные работы</em></li> <ul class='rabota' id='catal_rabot_2'> <li><em id=cat_rab_5>Фундамент</em></li> <ul class='rabota' id='catal_rabot_5'> </ul> <li><em id=cat_rab_6>Коробка дома</em></li> <ul class='rabota' id='catal_rabot_6'> </ul> </ul> </ul> если внутри функции echo поменять на переменную и вывести return ом, то результат получается снизу вверх. PHP: function ShowTree1($tree, $pid=0){ $echo.= " <ul class='rabota' id='catal_rabot_".$pid."'>".PHP_EOL; foreach ($tree as $id => $root) { if($pid!=$id)continue; if(count($root)) { foreach($root as $key => $title) { $echo.=" <li><em id=cat_rab_".$key.">".$title."</em></li>".PHP_EOL; if(count($tree)){ ShowTree1($tree,$key); } } } } $echo.= " </ul>".PHP_EOL; return $echo; } Помогите разобраться, а? От модератора: вставлять код через кнопку </>
Массивы приводи в формате var_export, чтоб можно было сразу в код копировать --- Добавлено --- Код данным не соответствует, и вообще бредовенько выглядит
PHP: $tree=Array ( [0] => Array ( [1] => Демонтажные работы [2] => Строительные работы ) [1] => Array ( [3] => Демонтаж стен и перегородок [4] => Демонтаж инженерных сетей [13] => Демонтаж кровли ) [2] => Array ( [5] => Фундамент [6] => Коробка дома ) ) $tree= var_export($tree); echo $tree; Так, или как-то иначе? Может я не правильно понял... --- Добавлено --- Код функции я взял из инета, это не мой,я только html добавил, но выводит верхняя функция, где echo, именно так как ниже. Я просто скопировал результат из браузера. А вот нижний, где return, вот он да, все выдает в обратном порядке и при применении onclick и slideToogle() скрытие и открытие происходит снизу вверх.
@Titych Ты привел значение переменной $tree выведенной с помощью print_r() или var_dump(). А тебе посоветовали показать вывод результата var_export($tree) echo не нужно
Понял, вот так? PHP: array ( 0 => array ( 1 => 'Демонтажные работы', 2 => 'Строительные работы', ), 1 => array ( 3 => 'Демонтаж стен и перегородок', 4 => 'Демонтаж инженерных сетей', 13 => 'Демонтаж кровли', ), 2 => array ( 5 => 'Фундамент', 6 => 'Коробка дома', ), )
Код (Text): Array ( [0] => Array ( [1] => Демонтажные работы [2] => Строительные работы ) [1] => Array ( [3] => Демонтаж стен и перегородок [4] => Демонтаж инженерных сетей [13] => Демонтаж кровли ) [2] => Array ( [5] => Фундамент [6] => Коробка дома ) ) Вот такой массив. Двухмерный. Доступ к элементам по индексам $tree[0][1] =='Демеонтажные работы'
Да, функция по индексам строит дерево, индекс=0 это корень индекс 1 имеет родителя с индексом 1 из первой итерации.
Судя по структуре , массив первого уровня имеет три элемента. Каждый из них - массив. Зачем ты внутри своей функции вызываешь ее же? Что тебе это дает? Там и так два цикла - наружный и внутренний.
Дает список многоуровневый, как в результате в топике. С любым количеством родителей и детей, т.е. уровней может быть не 2 а десять или сто. Эта функция как раз из массива, полученного из базы создает данную структуру. Рекурсивная функция именно это и делает, вызывает себя внутри себя при определенных условиях. Как раз то, что мне нужно, но я не справился пока.
Скажи для чего эта проверка if(count($root)) ?? Что получается в скобках если $root массив и что если строка? Я бы использовал if(is_array($root))