За последние 24 часа нас посетили 69175 программистов и 5402 робота. Сейчас ищет 1371 программист ...

Рекурсивная функция

Тема в разделе "PHP для новичков", создана пользователем Titych, 7 ноя 2022.

  1. Titych

    Titych Новичок

    С нами с:
    7 ноя 2022
    Сообщения:
    5
    Симпатии:
    0
    Всем здрасьте!
    Столкнулся с такой проблемой. У меня есть рекурсивная функция, которая выводит дерево. Все хорошо было до тех пор, пока мне не пришлось воспользоваться ajax. Выяснилось, что вывод данных из функции производившийся при помощи echo после обработки ajax выдает данные немного не в том формате. Опустив детали, скажу, что поменяв echo на переменную, организовав дописываение переменной к себе самой и выводом данных из функции return-ом, я получил эти же данные, но в обратном порядке... :(
    Я так и не могу понять, как мне организовать вывод данных из функции при помощи return так же как при помощи echo. Может мне кто-нибудь объяснит, в чем моя ошибка и как ее исправить?

    Вот данные, поступающие в функцию в переменной $tree:
    Array ( [0] => Array ( [1] => Демонтажные работы [2] => Строительные работы ) [1] => Array ( [3] => Демонтаж стен и перегородок [4] => Демонтаж инженерных сетей ) [2] => Array ( [5] => Фундамент [6] => Коробка дома ) )

    сама функция с выводом echo:
    PHP:
    1. function ShowTree1($tree, $pid=0){
    2.     echo "    <ul class='rabota' id='catal_rabot_".$pid."'>".PHP_EOL;
    3.     foreach ($tree as $id => $root) {
    4.         if($pid!=$id)continue;
    5.         if(count($root))
    6.         {
    7.             foreach($root as $key => $title)
    8.             {
    9.                 echo"                <li><em  id=cat_rab_".$key.">".$title."</em></li>".PHP_EOL;
    10.                 if(count($tree)){
    11.                     ShowTree1($tree,$key);
    12.                 }
    13.             }
    14.         }
    15.     }
    16.     echo "            </ul>".PHP_EOL;
    17. }
    Результат который меня устраивает:
    HTML:
    1.  
    2. <ul class='rabota' id='catal_rabot_0'>
    3.     <li><em  id=cat_rab_1>Демонтажные работы</em></li>
    4.     <ul class='rabota' id='catal_rabot_1'>
    5.         <li><em  id=cat_rab_3>Демонтаж стен и перегородок</em></li>
    6.         <ul class='rabota' id='catal_rabot_3'>
    7.         </ul>
    8.         <li><em  id=cat_rab_4>Демонтаж инженерных сетей</em></li>
    9.         <ul class='rabota' id='catal_rabot_4'>
    10.         </ul>
    11.     </ul>
    12.     <li><em  id=cat_rab_2>Строительные работы</em></li>
    13.     <ul class='rabota' id='catal_rabot_2'>
    14.         <li><em  id=cat_rab_5>Фундамент</em></li>
    15.         <ul class='rabota' id='catal_rabot_5'>
    16.         </ul>
    17.         <li><em  id=cat_rab_6>Коробка дома</em></li>
    18.         <ul class='rabota' id='catal_rabot_6'>
    19.         </ul>
    20.     </ul>
    21. </ul>
    22.  
    если внутри функции echo поменять на переменную и вывести return ом, то результат получается снизу вверх.
    PHP:
    1. function ShowTree1($tree, $pid=0){
    2.     $echo.= "    <ul class='rabota' id='catal_rabot_".$pid."'>".PHP_EOL;
    3.     foreach ($tree as $id => $root) {
    4.         if($pid!=$id)continue;
    5.         if(count($root))
    6.         {
    7.             foreach($root as $key => $title)
    8.             {
    9.                 $echo.="                <li><em  id=cat_rab_".$key.">".$title."</em></li>".PHP_EOL;
    10.                 if(count($tree)){
    11.                     ShowTree1($tree,$key);
    12.                 }
    13.             }
    14.         }
    15.     }
    16.     $echo.= "            </ul>".PHP_EOL;
    17.     return $echo;
    18. }
    Помогите разобраться, а?
    От модератора: вставлять код через кнопку </>
     
    #1 Titych, 7 ноя 2022
    Последнее редактирование модератором: 9 ноя 2022
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    Массивы приводи в формате var_export, чтоб можно было сразу в код копировать
    --- Добавлено ---
    Код данным не соответствует, и вообще бредовенько выглядит
     
  3. Titych

    Titych Новичок

    С нами с:
    7 ноя 2022
    Сообщения:
    5
    Симпатии:
    0
    PHP:
    1. $tree=Array ( [0] => Array ( [1] => Демонтажные работы [2] => Строительные работы ) [1] => Array ( [3] => Демонтаж стен и перегородок [4] => Демонтаж инженерных сетей [13] => Демонтаж кровли ) [2] => Array ( [5] => Фундамент [6] => Коробка дома ) )
    2. $tree= var_export($tree);
    3. echo $tree;
    Так, или как-то иначе?
    Может я не правильно понял...
    --- Добавлено ---
    Код функции я взял из инета, это не мой,я только html добавил, но выводит верхняя функция, где echo, именно так как ниже. Я просто скопировал результат из браузера. А вот нижний, где return, вот он да, все выдает в обратном порядке и при применении onclick и slideToogle() скрытие и открытие происходит снизу вверх.
     
  4. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    @Titych Ты привел значение переменной $tree выведенной с помощью print_r() или var_dump().
    А тебе посоветовали показать вывод результата var_export($tree)
    echo не нужно
     
  5. Titych

    Titych Новичок

    С нами с:
    7 ноя 2022
    Сообщения:
    5
    Симпатии:
    0
    Понял, вот так?
    PHP:
    1. array ( 0 => array ( 1 => 'Демонтажные работы', 2 => 'Строительные работы', ), 1 => array ( 3 => 'Демонтаж стен и перегородок', 4 => 'Демонтаж инженерных сетей', 13 => 'Демонтаж кровли', ), 2 => array ( 5 => 'Фундамент', 6 => 'Коробка дома', ), )
     
  6. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Код (Text):
    1. Array
    2. (
    3.     [0] => Array
    4.         (
    5.             [1] => Демонтажные работы
    6.             [2] => Строительные работы
    7.         )
    8.  
    9.     [1] => Array
    10.         (
    11.             [3] => Демонтаж стен и перегородок
    12.             [4] => Демонтаж инженерных сетей
    13.             [13] => Демонтаж кровли
    14.         )
    15.  
    16.     [2] => Array
    17.         (
    18.             [5] => Фундамент
    19.             [6] => Коробка дома
    20.         )
    21.  
    22. )
    Вот такой массив. Двухмерный. Доступ к элементам по индексам $tree[0][1] =='Демеонтажные работы'
     
  7. Titych

    Titych Новичок

    С нами с:
    7 ноя 2022
    Сообщения:
    5
    Симпатии:
    0
    Да, функция по индексам строит дерево, индекс=0 это корень индекс 1 имеет родителя с индексом 1 из первой итерации.
     
  8. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Судя по структуре , массив первого уровня имеет три элемента. Каждый из них - массив. Зачем ты внутри своей функции вызываешь ее же? Что тебе это дает? Там и так два цикла - наружный и внутренний.
     
  9. Titych

    Titych Новичок

    С нами с:
    7 ноя 2022
    Сообщения:
    5
    Симпатии:
    0
    Дает список многоуровневый, как в результате в топике. С любым количеством родителей и детей, т.е. уровней может быть не 2 а десять или сто. Эта функция как раз из массива, полученного из базы создает данную структуру.
    Рекурсивная функция именно это и делает, вызывает себя внутри себя при определенных условиях. Как раз то, что мне нужно, но я не справился пока.
     
  10. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Скажи для чего эта проверка if(count($root)) ?? Что получается в скобках если $root массив и что если строка? Я бы использовал if(is_array($root))