Я видел много функций 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>
я не тестировал его для вариаций демо-данных …
<?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>'; }