Имею древовидный массив. Элементы имеют некоторые характеристики и могут иметь потомка (массивы с такими же массивами-потомками). Хочу на выход отдать переменную, в которой преобразованный из массива 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;} Помогите, пожалуйста
Спасибо за ответ. $item массив так или иначе. Другое дело, что он может содержать подмассив(ы). Т.е. грубо говоря, имеем древовидные комментарии. На комментарий может быть ответ(ы), на ответ могут быть ответы и т.д. Такая же ситуация.
Упрощенно такой. При этом вложенность не ограничена. Извините, отступы не сохраняются, почему-то 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 ) )
Массив (основной) состоит из подмассивов 1, 2, 3. При этом, если присмотреться, массив 2 лежит в массиве 1. Это гипотетически. Может оказаться, что массив 3 так же лежит в массиве 1. Или же лежит в массиве 2, образуя Массив ((массив 1(массив 2(массив 3)))).
virus-07 Ну так тебе дали решение - если элемент массива тоже массив - вызываем функцию, иначе выходим на уровень выше.
Не понимаю решение. Вот я разбираю массив: 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 сам по себе массив по-любому.
ты неправильно форич понимаешь по ходу. Он каждый элемент массива разбирает на key =>value пары т.е. $item - это уже ЗНАЧЕНИЯ твоего массива. текст 2011-07-12 01:40:50 array() - > вот тут запустилалсь функция, которая проходит по внутреннему массиву и т.д. Если нужны ключи - foreach ($array as $key=>$value) - может так понятнее будет?
Можно хранить структуру в массивах, а сами элементы с id и прочими данными - в ArrayObject. Тогда is_array будет возвращать false для элементов с данными. PHP: <?php $array = array(); $array[0] = new ArrayObject(); $array[0]['id'] = 1; $array[1] = array(); $array[1][0] = new ArrayObject(); $array[1][0]['id'] = 2; $array[1][1] = new ArrayObject(); $array[1][1]['id'] = 3; $array[2] = new ArrayObject(); $array[2]['id'] = 4; fn($array); function fn($array) { foreach ($array as $item) { if (is_array($item)) { fn($item); } else { echo $item['id']; } } }
2tommyangelo, Медленно вникаю в то, что до меня пытаетесь донести. Спасибо. Пока, правда, не очень выходит. Возможно я заблуждаюсь, но, вроде, форич я верно понимаю. В первом проходе у меня окажется: [text] => текст [date] => 2011-07-12 01:40:30 [2] => Array Какая функция побудит пройтись по массиву с ключом 2? Условие проверит $item на массив. Он всегда массив. Даже если подмассива нет. Таким образом имеет смысл проверить все value на массив. foreach ( $Array as $key => $value ) { if(is_array($value){... Но это что-то невнятное.