0

我有下一个多维数组:

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Category 1
            [parent] => 0
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 3
                            [name] => Sub 1
                            [parent] => 1
                            [children] => Array
                                (
                                )
                        )
                    [1] => Array
                        (
                            [id] => 4
                            [name] => Sub 2
                            [parent] => 1
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 6
                                            [name] => Sub Sub 4
                                            [parent] => 4
                                            [children] => Array
                                                (
                                                )
                                        )
                                )
                        )
                )
        )
    [1] => Array
        (
            [id] => 2
            [name] => Category 2
            [parent] => 0
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 5
                            [name] => Sub 3
                            [parent] => 2
                            [children] => Array
                                (
                                )
                        )
                )
        )
)

我需要在页面上用不同的缩进呈现这个数组。例如:

  • 第一类
    • 子 1
    • 子 2
      • 子子 4
  • 第 2 类
    • 子 3

我知道我可以使用 SPL RecursiveArrayIterator,但我不知道怎么做。你能帮我吗,如何渲染这样的数组?

4

2 回答 2

1

您可以简单地通过编写一个函数并像这样递归调用它来做到这一点:

<?php

function list_items($data)
{
    echo '<ul>';
    foreach ($data as $cat)
    {
        echo '<li>'.$cat['name'];

        if (count($cat['children']) > 0)
        {
            list_items($cat['children']);
        }

        echo '</li>';
    }

    echo '</ul>';
}

$array = array(
    array(
        'id' => 1,
        'name' => 'Category 1',
        'parent' => 0,
        'children' => array(
            array(
                'id' => 3,
                'name' => 'Category 3',
                'parent' => 1,
                'children' => array()
            ),
            array(
                'id' => 4,
                'name' => 'Category 4',
                'parent' => 1,
                'children' => array(                    
                    array(
                        'id' => 5,
                        'name' => 'Category 5',
                        'parent' => 4,
                        'children' => array()
                    ),
                    array(
                        'id' => 6,
                        'name' => 'Category 6',
                        'parent' => 4,
                        'children' => array()
                    )
                )
            )
        )
    ),
    array(
        'id' => 2,
        'name' => 'Category 2',
        'parent' => 0,
        'children' => array(
            array(
                'id' => 7,
                'name' => 'Category 7',
                'parent' => 2,
                'children' => array()
            )
        )
    )
);

list_items($array);

产生:

<ul>
    <li>Category 1
        <ul>
            <li>Category 3</li>
            <li>
                Category 4
                <ul>
                    <li>Category 5</li>
                    <li>Category 6</li>
                </ul>               
            </li>
        </ul>   
    </li>
    <li>
        Category 2
        <ul>
            <li>Category 7</li>
        </ul>       
    </li>
</ul>
于 2012-09-05T08:20:33.717 回答
1

下面是如何实现 RecursiveArrayIterator (基本上直接从 PHP.net 复制:http ://www.php.net/manual/en/class.recursivearrayiterator.php#102574 )。

老实说,我不确定 ResursiveArrayIterator 对@MattHumphrey 的示例有多大帮助。

<?php

$array = [
    [
        'id' => 1,
        'name' => 'Category 1',
        'parent' => 0,
        'children' => [
            [
                'id' => 3,
                'name' => 'Category 3',
                'parent' => 1,
                'children' => []
            ],
            [
                'id' => 4,
                'name' => 'Category 4',
                'parent' => 1,
                'children' => [
                    [
                        'id' => 5,
                        'name' => 'Category 5',
                        'parent' => 4,
                        'children' => []
                    ],
                    [
                        'id' => 6,
                        'name' => 'Category 6',
                        'parent' => 4,
                        'children' => []
                    ]
                ]
            ]
        ]
    ],
    [
        'id' => 2,
        'name' => 'Category 2',
        'parent' => 0,
        'children' => [
            [
                'id' => 7,
                'name' => 'Category 7',
                'parent' => 2,
                'children' => []
            ]
        ]
    ]
];


$iterator = new RecursiveArrayIterator($array);
echo "<ul>";
iterator_apply($iterator, 'traverseStructure', array($iterator));
echo "</ul>";

function traverseStructure($iterator) {
    while ( $iterator -> valid() ) {

        if ( $iterator -> hasChildren() ) {
            echo "<li>Children: <ul>";

            traverseStructure($iterator -> getChildren());

            echo "</li></ul>";

        }
        else {
            echo "<li>" . $iterator -> key() . ' : ' . $iterator -> current() . "</li>";
        }

        $iterator -> next();
    }
}
于 2012-09-05T08:32:22.230 回答