PHP:如何生成一个<;ul>&书信电报;李>;xml2assoc数组结果中的树?
我见过许多PHP函数如何生成PHP:如何生成一个<;ul>&书信电报;李>;xml2assoc数组结果中的树?,php,tree,Php,Tree,我见过许多PHP函数如何生成标记,但我想我的数组输入相当复杂。它是从名为 我的问题是如何使用PHP将返回的xml2assoc数组结果转换为格式化的HTML代码 谢谢 $tree = array( 0 => array( 'tag' => 'NavigationMode', 'value' => array( 0 => array( 'tag' => 'Title',
标记,但我想我的数组输入相当复杂。它是从名为
我的问题是如何使用PHP将返回的xml2assoc数组结果转换为格式化的HTML代码
谢谢
$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>
-
介绍
- 子介绍
- 单元1
如果您有XML作为输入,为什么不使用XSLT将其转换为
我猜您的输入是这样的(我假设“NavigationMode”是一个输入错误):
介绍
子介绍
单元1
使用小型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>
-
介绍
- 子介绍
- 单元1
这很简单。如果您有XML作为输入,为什么不使用XSLT将其转换为
我猜您的输入是这样的(我假设“NavigationMode”是一个输入错误):
介绍
子介绍
单元1
使用小型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>
-
介绍
- 子介绍
- 单元1
这很简单。下面是一个针对数组结构的快速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>';
}
函数创建html列表($nodes)
{
回声“”;
foreach($node作为$node){
$childNodes=$node['value'];
$titleNode=array\u shift($childNodes);
回声“- ”,$titleNode['value'];
如果(计数($childNodes)>0){
创建html列表($childNodes);
}
回声“
”;
}
回声“
”;
}
以下是一个针对数组结构的快速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>';
}
函数创建html列表($nodes)
{
回声“”;
foreach($node作为$node){
$childNodes=$node['value'];
$titleNode=array\u shift($childNodes);
回声“- ”,$titleNode['value'];
如果(计数($childNodes)>0){
创建html列表($childNodes);
}
回声“
”;
}
回声“
”;
}
我没有测试演示数据的变化
<?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>';
?>
我没有测试演示数据的变化
<?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的递归格式并不完全友好。你试过simplexml()吗?@mladen:xml与他的问题无关。他已经得到了漂亮的数组$tree数据struct@mladen:我以前的老板告诉我simplexml不能处理大于2MB的xml文件,所以我使用了xml2assoc。我很难解决我的问题:(“但我想我的数组输入相当复杂”-不,不是。可能更容易,但也没那么糟糕。@marknt15:+1因为这个问题的形式比大多数第一次提问要好得多。xml的递归格式不完全友好。您尝试过simplexml吗()?@mladen:xml与他的问题无关。他已经得到了漂亮的数组$tree数据struct@mladen:我以前的老板告诉我simplexml不能处理大于2MB的xml文件,所以我使用了xml2assoc。我很难解决我的问题:(“但我想我的数组输入相当复杂”-不,不是。可能更简单,但也没那么糟糕。@marknt15:+1因为这个问题比大多数第一次提问的形式要好得多。