【问题标题】:Convert Array into Ul-Li将数组转换为 Ul-Li
【发布时间】:2013-05-26 02:27:04
【问题描述】:

我有一个这样的数组

Array
(
    [0] => Array
        (
            [name] => Region
            [id] => 3
            [parent_id] => 2
            [children] => Array
                (
                    [0] => Array
                        (
                            [name] => Asia
                            [id] => 4
                            [parent_id] => 3
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [name] => Central Asia
                                            [id] => 6621
                                            [parent_id] => 4
                                            [children] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [name] => Afghanistan
                                                            [id] => 5
                                                            [parent_id] => 6621
                                                            [children] => Array
                                                                (
                                                                    [0] => Array
                                                                        (
                                                                            [name] => Balkh
                                                                            [id] => 6
                                                                            [parent_id] => 5
                                                                            [children] => Array
                                                                                (
                                                                                    [0] => Array
                                                                                        (
                                                                                            [name] => Mazar-e-Sharif
                                                                                            [id] => 7
                                                                                            [parent_id] => 6
                                                                                        )

                                                                                )

                                                                        )

                                                                    [1] => Array
                                                                        (
                                                                            [name] => Kabol
                                                                            [id] => 10
                                                                            [parent_id] => 5
                                                                        )

                                                                    [2] => Array
                                                                        (
                                                                            [name] => Qandahar
                                                                            [id] => 12
                                                                            [parent_id] => 5
                                                                        )

                                                                )

                                                        )

                                                )

                                        )

                                    [1] => Array
                                        (
                                            [name] => Middle East
                                            [id] => 6625
                                            [parent_id] => 4
                                            [children] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [name] => Armenia
                                                            [id] => 14
                                                            [parent_id] => 6625
                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

)

现在我想将此数组转换为树格式中的ul-li

但它给了我奇怪的输出

例如Region我想要这样

<li id=3 parent_id=2 > Region </li>

这里我想使用idparent_id 作为属性 php函数是

    function olLiTree($tree)
    {
        echo '<ul>';
        foreach($tree as $key => $item) {
            if (is_array($item)) {
                echo '<li>', $key;
                olLiTree($item);
                echo '</li>';
            } else {
                echo '<li>', $item, '</li>'; 
            }
        }
        echo '</ul>';
    }

上面函数的区域输出是这样的

<ul>
    <li>0
        <ul>
            <li>Region</li>
            <li>3</li>
            <li>2</li>
            <li>children
                <ul>

【问题讨论】:

  • 你能指定你目前得到什么输出吗?
  • 你能编辑你的问题并添加你的输出吗..
  • 您的 foreach 循环不正确。您必须将 $item['children'] 作为函数的属性以使其递归。

标签: php arrays function multidimensional-array


【解决方案1】:

试试这个:


/**
 * requires the following keys: id, parent_id, name;
 * may contain the following key: children
 *
 * @param  array   $array
 * @return string  ul-li html
 */
function arrayToHtml( array $array ) : string
{
    $html = '';
    if(count($array)) {
        $html .= '<ul>';
        foreach ( $array as $value ) {
            if (is_array($value)) {
                $idString = 'id="' . ($value['id'] ?? '0') .'"';
                $parentIdString = 'parent_id="' . ($value['parent_id'] ?? '0') . '"';
                $attributes = $idString . ' ' . $parentIdString;
                $value['children'] = $value['children'] ?? [];
                $value['name'] = $value['name'] ?? 'error';
                $html .= '<li ' . $attributes . '>' . $value['name'] . ':' . $this->arrayToHtml($value['children']) . '</li>';
            }
        }
        $html .= '</ul>';
    }

    return $html;
}

【讨论】:

    【解决方案2】:

    我认为这个是正确的:

    function olLiTree($tree) {
        echo "<ul>";
        foreach ($tree as $v) {
            echo "<li id='{$v['id']}' parent_id='{$v['parent_id']}'>{$v['name']}</li>";
            if ($v['children'])
                olLiTree($v['children']);
        }
        echo "</ul>";
    }
    

    输出:

      地区
        亚洲
          中部 亚洲
            阿富汗
              巴尔赫
                马扎里沙里夫
              卡博尔坎大哈
          中东
            亚美尼亚

    【讨论】:

      【解决方案3】:

      也许这是你寻求的递归。

      function olLiTree( $tree ) {
          echo '<ul>';
          foreach ( $tree as $item ) {
              echo "<li id=\"$item[id]\" parent_id=\"$item[parent_id]\" > $item[name] </li>";
              if ( isset( $item['children'] ) ) {
                  olLiTree( $item['children'] );
              }
          }
          echo '</ul>';
      }
      

      【讨论】:

        猜你喜欢
        • 2023-04-02
        • 2018-11-30
        • 2012-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 2019-08-15
        相关资源
        最近更新 更多