【问题标题】:Multidimensional array to HTML unordered list多维数组到 HTML 无序列表
【发布时间】:2014-09-12 00:05:14
【问题描述】:

我有以下数组,我想将其转换为无序列表 (HTML)。

Array
(
    [0] => Array
        (
            [url] => /
            [id] => 53a8717fe9ab5
            [template] => home
            [title] => Home
        )

    [1] => Array
        (
            [url] => /about
            [id] => 53a871fe8b05b
            [template] => content
            [title] => About
        )

    [2] => Array
        (
            [url] => /about/sub
            [id] => 53cb88b7ed22d
            [template] => content
            [title] => About (sub)
        )

    [3] => Array
        (
            [url] => /about/sub/subsub
            [id] => 53cb88bc7d32d
            [template] => content
            [title] => About (subsub)
        )

    [4] => Array
        (
            [url] => /contact
            [id] => 53a8718981161
            [template] => content
            [title] => Contact us
        )

)

所以我正在尝试从上面的数组创建一个多维数组,如下所示:

Array
(
    [0] => /
    [1] => /about
    [about] => Array
        (
            [0] => /about/sub
            [sub] => Array
                (
                    [0] => /about/sub/subsub
                )

        )

    [2] => /contact
)

但就我所知……更不用说创建实际的<ul>了。

非常感谢任何帮助。

编辑

我使用以下方法生成了递归<ul>

private function generateTree($from) {
    $to = [];

    foreach ( $from as $element ) {
        $path = explode('/', $element["url"]);
        if ( count($path) === 1 ) array_unshift($path, '/');

        $_to = &$to;
        for ( $i = 0; $i < count($path)-1; $i++ ) {
            if ( !array_key_exists($path[$i], $_to) ) $_to[$path[$i]] = [];
            $_to = &$_to[$path[$i]];
            print_r ( implode("/", $path));
            echo "<br>";
        }
        $_to[] = $element["url"];
    }

    return $to[""];
}

这是我的预期输出:

<ul>
    <li><a href="/">Home</a></li>
    <li>
        <a href="/about">About</a>
        <ul>
            <li>
                <a href="/about/sub">About (sub)</a>
                <ul>
                    <li><a href="/about/sub/subsub">About (subsub)</a></li>
                </ul>
            </li>
        </ul>
    </li>
    <li><a href="/contact">Contact</a></li>
</ul>

【问题讨论】:

  • 查看任何可用于 PHP 的模板库。
  • 我想在没有图书馆的情况下这样做。这更像是一种学习体验;)如果您的意思是举例;介意给我一个起点吗?

标签: php html arrays multidimensional-array


【解决方案1】:

试试这样的函数:

function ToUl($input){
   echo "<ul>";

   $oldvalue = null;
   foreach($input as $value){
     if($oldvalue != null && !is_array($value))
        echo "</li>";
     if(is_array($value)){
        ToUl($value);
     }else
        echo "<li>" + $value;
      $oldvalue = $value;
    }

    if($oldvalue != null)
      echo "</li>";

   echo "</ul>";
}

[编辑]

我将保留为每个数组创建一个li 的函数,这样更简单,以防任何读者需要它:

function ToUl($input){
   echo "<ul>";

   foreach($input as $value)
     if(is_array($value)){
        echo "<li>";
        ToUl($value);
        echo "</li>";
     }else
        echo "<li>" + $value + "</li>";

   echo "</ul>";
}

【讨论】:

  • 这样做的问题是&lt;ul&gt; 将被放置在其父级的关闭&lt;/li&gt; 之后。我希望它在&lt;ul&gt; 内。
  • 现在它拥有自己的&lt;li&gt;。我希望它在父级的&lt;li&gt; 内。
  • 你能放一个你正在寻找的输出的示例 html 吗?
  • 我编辑了我的原始问题并添加了预期的输出;)
猜你喜欢
  • 2023-03-30
  • 2016-01-13
  • 2021-09-06
  • 1970-01-01
  • 2020-05-27
  • 2021-04-14
  • 2011-09-02
  • 2012-12-08
  • 1970-01-01
相关资源
最近更新 更多