PHP: Как создать дерево <ul><li> в результате массива xml2assoc? - PullRequest
1 голос
/ 24 апреля 2009

Я видел много 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>

Ответы [ 3 ]

3 голосов
/ 24 апреля 2009

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

Полагаю, ваш ввод выглядит примерно так (я полагаю, "Navigation 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. Это просто.

2 голосов
/ 24 апреля 2009

Вот краткая реализация 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>';
}
1 голос
/ 24 апреля 2009

я не проверял его на вариации демонстрационных данных ...

<?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>';

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...