【问题标题】:Nested array to HTML list嵌套数组到 HTML 列表
【发布时间】:2011-10-06 08:33:15
【问题描述】:

我有以下数组:

Array
(
    [0] => Array
        (
            [ID] => 1
            [PARENT] => 0
            [NAME] => Your first category
        )
    [1] => Array
        (
            [ID] => 2
            [PARENT] => 1
            [NAME] => Your first forum
        )
    [2] => Array
        (
            [ID] => 4
            [PARENT] => 1
            [NAME] => Another Forum
        )
    [3] => Array
        (
            [ID] => 5
            [PARENT] => 1
            [NAME] => Good Forum
        )
    [4] => Array
        (
            [ID] => 6
            [PARENT] => 0
            [NAME] => Top Forum
        )
    [5] => Array
        (
            [ID] => 7
            [PARENT] => 6
            [NAME] => Sub Forum #1
        )
    [6] => Array
        (
            [ID] => 9
            [PARENT] => 7
            [NAME] => Sub Forum #1-1
        )
    [7] => Array
        (
            [ID] => 10
            [PARENT] => 7
            [NAME] => Sub Forum #1-2
        )
    [8] => Array
        (
            [ID] => 8
            [PARENT] => 6
            [NAME] => Sub Forum #2
        )
)

好的,这里我有请求的 var_export 结果:

array (
  0 => 
  array (
    'ID' => '1',
    'PARENT' => '0',
    'NAME' => 'Your first category',
  ),
  1 => 
  array (
    'ID' => '2',
    'PARENT' => '1',
    'NAME' => 'Your first forum',
  ),
  2 => 
  array (
    'ID' => '4',
    'PARENT' => '1',
    'NAME' => 'Another Forum',
  ),
  3 => 
  array (
    'ID' => '5',
    'PARENT' => '1',
    'NAME' => 'Good Forum',
  ),
  4 => 
  array (
    'ID' => '6',
    'PARENT' => '0',
    'NAME' => 'Top Forum',
  ),
  5 => 
  array (
    'ID' => '7',
    'PARENT' => '6',
    'NAME' => 'Sub Forum #1',
  ),
  6 => 
  array (
    'ID' => '9',
    'PARENT' => '7',
    'NAME' => 'Sub Forum #1-1',
  ),
  7 => 
  array (
    'ID' => '10',
    'PARENT' => '7',
    'NAME' => 'Sub Forum #1-2',
  ),
  8 => 
  array (
    'ID' => '8',
    'PARENT' => '6',
    'NAME' => 'Sub Forum #2',
  ),
)

其中一些数组 PARENT 值对应于另一个数组 ID 值。这有助于我使它们嵌套。但问题是:如何创建一个看起来像这样的 HTML 列表:

<ul>
    <li id="1">
        Your First Category
        <ul>
            <li id="2">
                Your First Forum
            </li>
            <li id="4">
                Another Forum
            </li>
            <li id="5">
                Good Forum
            </li>
        <ul>
    </li>
    <li id="6">
        Top Forum
        <ul>
            <li id="7">
                Sub Forum #1
                <ul>
                    <li id="9">
                        Sub Forum #1-1
                    </li>
                    <li id="10">
                        Sub Forum #1-2
                    </li>
                </ul>
            </li>
            <li id="7">
                Sub Forum #2
            </li>
        <ul>
    </li>
</ul>

有什么想法吗?

【问题讨论】:

  • 如果你输出的是var_export()而不是print_r(),那就简单多了...
  • 我宁愿将数组转换为适当的嵌套形式,然后再将其转换为 HTML 列表。
  • 这就是我需要的!更改数组形式以便在以后的操作中使用 HTML 布局。我只是显示 HTML 以显示我需要的数组形式。
  • 不要让 php 为您的数组编号,而是使用 ID 列作为数组键。然后获取父母是一个微不足道的数组查找。您必须注意一个递归数组,其中父母的父母是孩子。
  • 你能告诉我你的意思吗?这看起来是个好主意,但我一点也不明白! :?

标签: php html arrays


【解决方案1】:

我会做什么:

  1. 按父 ID 对菜单(?)项进行分组 - $menu[$parentID] = array($child, $child, ...)
  2. 使用递归函数为每个父级生成菜单 - makeMenu($menu, $parentID)

这将允许您访问每个节点两次 - 第一次是重新排序数组时,第二次是打印节点时。因此它适用于小型和大型阵列。

来源:

$data = array(
    0 => array(
        'ID'     => '1',
        'PARENT' => '0',
        'NAME'   => 'Your first category',
    ),
    1 => array(
        'ID'     => '2',
        'PARENT' => '1',
        'NAME'   => 'Your first forum',
    ),
    2 => array(
        'ID'     => '4',
        'PARENT' => '1',
        'NAME'   => 'Another Forum',
    ),
    3 => array(
        'ID'     => '5',
        'PARENT' => '1',
        'NAME'   => 'Good Forum',
    ),
    4 => array(
        'ID'     => '6',
        'PARENT' => '0',
        'NAME'   => 'Top Forum',
    ),
    5 => array(
        'ID'     => '7',
        'PARENT' => '6',
        'NAME'   => 'Sub Forum #1',
    ),
    6 => array(
        'ID'     => '9',
        'PARENT' => '7',
        'NAME'   => 'Sub Forum #1-1',
    ),
    7 => array(
        'ID'     => '10',
        'PARENT' => '7',
        'NAME'   => 'Sub Forum #1-2',
    ),
    8 => array(
        'ID'     => '8',
        'PARENT' => '6',
        'NAME'   => 'Sub Forum #2',
    ),
);

// reorder array
$menu = array();
foreach ( $data as $item ) {
    $menu[$item['PARENT']][] = $item;
}

// print menu
function makeMenu($menu, $parentID) {
    $html = "<ul>";
    foreach ( $menu[$parentID] as $item ) {
        $html .= "<li id='{$item['ID']}'>{$item['NAME']}";
        if ( isset($menu[$item['ID']]) ) {
            $html .= makeMenu($menu, $item['ID']);
        }
        $html .= "</li>";
    }
    $html .= "</ul>";
    return $html;
}
echo makeMenu($menu, 0);

输出(手动添加间距):

<ul>
    <li id='1'>
        Your first category
        <ul>
            <li id='2'>Your first forum</li>
            <li id='4'>Another Forum</li>
            <li id='5'>Good Forum</li>
        </ul>
    </li>
    <li id='6'>
        Top Forum
        <ul>
            <li id='7'>Sub Forum #1
                <ul>
                    <li id='9'>Sub Forum #1-1</li>
                    <li id='10'>Sub Forum #1-2</li>
                </ul>
            </li>
            <li id='8'>Sub Forum #2</li>
        </ul>
    </li>
</ul>

【讨论】:

    【解决方案2】:
    $new_arr = array();
    foreach($arr as $data) $new_arr[$data['id']] = $data;
    
    foreach($new_arr as $id => &$data) $data['parent'] =& $new_arr[$data['parent']];
    

    现在你有了一个正确的数组结构。

    但您可能必须将其翻过来,因为它是由子结构构成的。但是您的输出是由父级输出的。

    因此,不要执行我发布的第二个 foreach,而是执行以下操作:

    foreach($new_arr as $id => $data) $new_arr[$data['parent']]['children'][] =& $data;
    

    【讨论】:

    • 感谢 sn-p !我现在就试试,我会在这里回答结果! :)
    • @Merianos,你只需要一个级别的孩子吗?
    • 不,我需要不止一个级别。我喜欢做的是从 phpBB 中检索所有类别和论坛作为嵌套列表
    • 几乎。你现在可以在这里看到我的下一个问题stackoverflow.com/questions/7673044/…
    • 请注意,我有一个错字。我写了&amp;= 而不是=&amp;
    猜你喜欢
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    相关资源
    最近更新 更多