PHP:如何生成一个<;ul>&书信电报;李>;xml2assoc数组结果中的树?

PHP:如何生成一个<;ul>&书信电报;李>;xml2assoc数组结果中的树?,php,tree,Php,Tree,我见过许多PHP函数如何生成标记,但我想我的数组输入相当复杂。它是从名为 我的问题是如何使用PHP将返回的xml2assoc数组结果转换为格式化的HTML代码 谢谢 $tree = array( 0 => array( 'tag' => 'NavigationMode', 'value' => array( 0 => array( 'tag' => 'Title',

我见过许多PHP函数如何生成
标记,但我想我的数组输入相当复杂。它是从名为

我的问题是如何使用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因为这个问题比大多数第一次提问的形式要好得多。