Intereting Posts
Как присоединиться к таблицам в Zend при использовании класса, который наследуется от Zend_Db_Table_Row_Abstract? как вызвать функцию другого файла без включения этого файла Увеличьте размер загрузки на Nginx Получить значение reCaptcha через javascript? как рисовать полупрозрачный прямоугольник в php? Looping PHP Nested Arrays – Извлечение значений в Blade Views (Laravel) Сервер Android PHP Вы знаете какие-либо популярные PHP-шаблоны для php, которые имеют концепцию текущего контекстного узла? нажмите новое значение для внутреннего массива mongodb – mongodb / php Хотите вручную отправить SYN ACK-пакеты для установления TCP-соединения (по возможности, в PHP) Что быстрее: многие ifs, а если? Вырезать содержимое после 10 слов Проверка наличия элементов одного массива в другом массиве в PHP Почему и как вы используете Исключения в этом примере кода PHP? "Preg_match (): Ошибка компиляции: несогласованные скобки" в PHP для допустимого шаблона

PHP: Как сгенерировать дерево <ul> <li> в массиве xml2assoc?

Я видел много функций PHP о том, как сгенерировать <ul><li> но мой ввод массива довольно сложный, я думаю. Это массив, возвращаемый из пользовательской функции, называемой xml2assoc

Мой вопрос заключается в том, как преобразовать возвращаемый результат массива xml2assoc в HTML-код <ul><li> с помощью PHP.

Благодарю.

 $tree = array( 0 => array( 'tag' => 'NavigationMode', 'value' => array( 0 => array( 'tag' => 'Title', 'value' => 'Introduction' ), 1 => array( 'tag' => 'NavigationNode', 'value' => array( 0 => array( 'tag' => 'Title', 'value' => 'Sub Intro' ) ) ) ) ), 1 => array( 'tag' => 'NavigationMode', 'value' => array( 0 => array( 'tag' => 'Title', 'value' => 'Module 1' ) ) ) ); 

Конечный результат, который мне нужно создать, выглядит следующим образом:

 <ul> <li> Introduction <ul> <li>Sub Intro</li> </ul> </li> <li>Module 1</li> </ul> 

Related of "PHP: Как сгенерировать дерево <ul> <li> в массиве xml2assoc?"

я не тестировал его для вариаций демо-данных …

 <?php function getTitle($node) { foreach ($node['value'] as $cnode) { if ($cnode['tag'] == 'Title') { return $cnode['value']; } } return 'untitled'; } function getCNodes($node) { $cnodes = array(); foreach ($node['value'] as $cnode) { if ($cnode['tag'] == 'NavigationNode') { $cnodes[] = $cnode; } } return $cnodes; } function runTree($node) { $title = getTitle($node); $cnodes = getCNodes($node); if (count($cnodes) > 0) { $out = '<li>' . $title . "\n" . '<ul>'; foreach ($cnodes as $cnode) { $out .= runTree($cnode); } $out .= '</ul>' . "\n" . '</li>' . "\n"; return $out; } else { return '<li>' . $title . '</li>' . "\n"; } } $tree = array( 0 => array( 'tag' => 'NavigationMode', 'value' => array( 0 => array( 'tag' => 'Title', 'value' => 'Introduction' ), 1 => array( 'tag' => 'NavigationNode', 'value' => array( 0 => array( 'tag' => 'Title', 'value' => 'Sub Intro' ) ) ) ) ), 1 => array( 'tag' => 'NavigationMode', 'value' => array( 0 => array( 'tag' => 'Title', 'value' => 'Module 1' ) ) ) ); echo '<ul>'; foreach ($tree as $node) { echo runTree($node); } echo '</ul>'; ?> 

Если у вас есть XML в качестве входных данных, почему бы не использовать XSLT, чтобы преобразовать его в <ul> ?

Я предполагаю, что ваш ввод выглядит примерно так (я предполагаю, что «Навигация M ode» – это опечатка):

 <tree> <NavigationNode> <title>Introduction</title> <NavigationNode> <title>Sub Intro</title> </NavigationNode> </NavigationNode> <NavigationNode> <title>Module 1</title> </NavigationNode> </tree> 

С небольшой таблицей стилей XSLT 1.0:

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes" /> <xsl:template match="/tree"> <ul> <xsl:apply-templates select="NavigationNode" /> </ul> </xsl:template> <xsl:template match="NavigationNode"> <li> <xsl:value-of select="title" /> <xsl:if test="NavigationNode"> <ul> <xsl:apply-templates select="NavigationNode" /> </ul> </xsl:if> </li> </xsl:template> </xsl:stylesheet> 

Этот выход получается:

 <ul> <li> Introduction <ul> <li>Sub Intro</li> </ul> </li> <li>Module 1</li> </ul> 

Документация PHP показывает, как использовать XSLT. Это просто.

Вот краткая реализация PHP для вашей структуры массива, чтобы вы начали:

 function create_html_list($nodes) { echo '<ul>'; foreach ($nodes as $node) { $childNodes = $node['value']; $titleNode = array_shift($childNodes); echo "<li>", $titleNode['value']; if (count($childNodes) > 0) { create_html_list($childNodes); } echo "</li>"; } echo '</ul>'; }