За последние 24 часа нас посетили 25913 программистов и 1726 роботов. Сейчас ищут 922 программиста ...

Рекурсивная функция, как составить?

Тема в разделе "PHP для новичков", создана пользователем virus-07, 14 июл 2011.

  1. virus-07

    virus-07 Активный пользователь

    С нами с:
    9 май 2011
    Сообщения:
    37
    Симпатии:
    0
    Имею древовидный массив. Элементы имеют некоторые характеристики и могут иметь потомка (массивы с такими же массивами-потомками). Хочу на выход отдать переменную, в которой преобразованный из массива html-код. Для примера его и параметры функции сократил до 1 параметра, обернутого в <p></p>.
    Собственно вопроса 3: как проверить на наличие "детей" объект, передать всех детей по очереди и как нормально вызвать функцию изнутри?

    public function tree_to_html($исходный массив){
    global $string;
    foreach ($array as $item) {
    $string .= "<p>".$item['id']."</p>";
    if (есть дети){
    tree_to_html(передать детей);}
    }
    return $string;
    break;}


    Помогите, пожалуйста
     
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    PHP:
    1. if (is_array($item)) {
    2.      tree_to_html($item);
    3. } else {
    4.      $string .= "<p>".$item['id']."</p>";
    5. }
     
  3. virus-07

    virus-07 Активный пользователь

    С нами с:
    9 май 2011
    Сообщения:
    37
    Симпатии:
    0
    Спасибо за ответ.
    $item массив так или иначе. Другое дело, что он может содержать подмассив(ы).
    Т.е. грубо говоря, имеем древовидные комментарии.
    На комментарий может быть ответ(ы), на ответ могут быть ответы и т.д. Такая же ситуация.
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    структуру массива покажи
     
  5. virus-07

    virus-07 Активный пользователь

    С нами с:
    9 май 2011
    Сообщения:
    37
    Симпатии:
    0
    Упрощенно такой. При этом вложенность не ограничена. Извините, отступы не сохраняются, почему-то
    Array
    (
    [1] => Array
    (
    [text] => текст
    [date] => 2011-07-12 01:40:30
    [2] => Array
    (
    [text] => текст
    [date] => 2011-07-12 01:40:50
    )

    )

    [3] => Array
    (
    [text] => текст
    [date] => 2011-07-12 01:45:50
    )
    )
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    и где тут вложенность?
     
  7. virus-07

    virus-07 Активный пользователь

    С нами с:
    9 май 2011
    Сообщения:
    37
    Симпатии:
    0
    Массив (основной) состоит из подмассивов 1, 2, 3. При этом, если присмотреться, массив 2 лежит в массиве 1.

    Это гипотетически. Может оказаться, что массив 3 так же лежит в массиве 1. Или же лежит в массиве 2, образуя Массив ((массив 1(массив 2(массив 3)))).
     
  8. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    virus-07
    Ну так тебе дали решение - если элемент массива тоже массив - вызываем функцию, иначе выходим на уровень выше.
     
  9. virus-07

    virus-07 Активный пользователь

    С нами с:
    9 май 2011
    Сообщения:
    37
    Симпатии:
    0
    Не понимаю решение. Вот я разбираю массив: foreach ($array as $item) { ...
    Как мне поставить условие на подмассив, если item потенциально имеет вид:
    item[text] => текст
    item[date] => 2011-07-12 01:40:50
    item[n] => подмассив
    item [e] => подмассив
    item [z] => подмассив, и т.д., где n, e, z — могут существовать или не существовать и т.д.?
    item сам по себе массив по-любому.
     
  10. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    ты неправильно форич понимаешь по ходу.
    Он каждый элемент массива разбирает на key =>value пары

    т.е. $item - это уже ЗНАЧЕНИЯ твоего массива.

    текст
    2011-07-12 01:40:50
    array() - > вот тут запустилалсь функция, которая проходит по внутреннему массиву

    и т.д.

    Если нужны ключи - foreach ($array as $key=>$value) - может так понятнее будет?
     
  11. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Можно хранить структуру в массивах, а сами элементы с id и прочими данными - в ArrayObject. Тогда is_array будет возвращать false для элементов с данными.
    PHP:
    1. <?php
    2.  
    3. $array = array();
    4. $array[0] = new ArrayObject();
    5. $array[0]['id'] = 1;
    6. $array[1] = array();
    7. $array[1][0] = new ArrayObject();
    8. $array[1][0]['id'] = 2;
    9. $array[1][1] = new ArrayObject();
    10. $array[1][1]['id'] = 3;
    11. $array[2] = new ArrayObject();
    12. $array[2]['id'] = 4;
    13. fn($array);
    14.  
    15. function fn($array) {
    16.      foreach ($array as $item) {
    17.           if (is_array($item)) {
    18.                fn($item);
    19.           } else {
    20.                echo $item['id'];
    21.           }
    22.      }
    23. }
     
  12. virus-07

    virus-07 Активный пользователь

    С нами с:
    9 май 2011
    Сообщения:
    37
    Симпатии:
    0
    2tommyangelo,
    Медленно вникаю в то, что до меня пытаетесь донести. Спасибо. Пока, правда, не очень выходит.
    Возможно я заблуждаюсь, но, вроде, форич я верно понимаю.
    В первом проходе у меня окажется:
    [text] => текст
    [date] => 2011-07-12 01:40:30
    [2] => Array

    Какая функция побудит пройтись по массиву с ключом 2?
    Условие проверит $item на массив. Он всегда массив. Даже если подмассива нет.
    Таким образом имеет смысл проверить все value на массив.
    foreach ( $Array as $key => $value ) {
    if(is_array($value){...


    Но это что-то невнятное.