【问题标题】:How to convert one dimensional array into nested <li>?如何将一维数组转换为嵌套 <li>?
【发布时间】:2019-11-18 09:42:28
【问题描述】:

如何将一维数组转换为多维数组或嵌套的&lt;li&gt;HTML。

下面是基于parent_id的嵌套&lt;li&gt;中需要的数组

Array (
[5] => Array
    (
        [data_id] => 5
        [data_parent] => 4
        [data_level] => 
        [data_prefix] => 
        [data_title] => Assets
        [data_link] => 0
    )

[57] => Array
    (
        [data_id] => 57
        [data_parent] => 5
        [data_level] => 
        [data_prefix] => 
        [data_title] => Fixed Assets
        [data_link] => 0
    )

[52] => Array
    (
        [data_id] => 52
        [data_parent] => 5
        [data_level] => 
        [data_prefix] => 
        [data_title] => Asset Two
        [data_link] => 1
    )

[51] => Array
    (
        [data_id] => 51
        [data_parent] => 5
        [data_level] => 
        [data_prefix] => 
        [data_title] => Assset ONE
        [data_link] => 1
    )

[48] => Array
    (
        [data_id] => 48
        [data_parent] => 4
        [data_level] => 
        [data_prefix] => 
        [data_title] => Expenses
        [data_link] => 0
    )

[50] => Array
    (
        [data_id] => 50
        [data_parent] => 48
        [data_level] => 
        [data_prefix] => 
        [data_title] => Expense One
        [data_link] => 1
    )

[49] => Array
    (
        [data_id] => 49
        [data_parent] => 48
        [data_level] => 
        [data_prefix] => 
        [data_title] => Expense One
        [data_link] => 1
    )

[58] => Array
    (
        [data_id] => 58
        [data_parent] => 57
        [data_level] => 
        [data_prefix] => 
        [data_title] => Vehicles
        [data_link] => 1
    )

)

【问题讨论】:

  • 向我们展示您的最佳尝试,我们会从那里拿走它

标签: php html arrays multidimensional-array


【解决方案1】:

可以先创建父子递归数组,

function buildTree(array $elements, $options = [
    'parent_id_column_name' => 'parent_id',
    'children_key_name'     => 'children',
    'id_column_name'        => 'id',
], $parentId = 0) {
    $branch = [];
    foreach ($elements as $element) {
        if ($element[$options['parent_id_column_name']] == $parentId) {
            $children = buildTree($elements, $options, $element[$options['id_column_name']]);
            if ($children) {
                $element[$options['children_key_name']] = $children;
            }
            $branch[] = $element;
        }
    }
    return $branch;
}
// 4 as first parent is
$temp = buildTree($arr, [
    'parent_id_column_name' => 'data_parent',
    'children_key_name'     => 'children',
    'id_column_name'        => 'data_id'], 4);

然后递归地将ul和li应用到上面的数组,

// 4 as first parent is
$temp = buildTree($arr, [
    'parent_id_column_name' => 'data_parent',
    'children_key_name'     => 'children',
    'id_column_name'        => 'data_id'], 4);
function printTree($tree)
{
    if (!is_null($tree) && count($tree) > 0) {
        echo '<ul>';
        foreach ($tree as $node) {
            // you can use whole $node here including all values of each node
            echo '<li>' . $node['data_title'];
            if (!empty($node['children'])) {
                printTree($node['children']);
            }
            echo '</li>';
        }
        echo '</ul>';
    }
}
printTree($temp);

Demo

输出:-

<ul>
    <li>Assets<ul>
            <li>Fixed Assets<ul>
                    <li>Vehicles</li>
                </ul>
            </li>
            <li>Asset Two</li>
            <li>Assset ONE</li>
        </ul>
    </li>
    <li>Expenses<ul>
            <li>Expense One</li>
            <li>Expense One</li>
        </ul>
    </li>
</ul>

我参考了link1link2的答案。

【讨论】:

    【解决方案2】:

    您可以使用 foreach 和排序创建多维数组

    $newArray = [];
    
    foreach($array as $value) {
        $newArray[$value['data_parent']][] = $value;
    }
    
    var_dump($newArray);
    

    【讨论】:

    • 谢谢亲爱的,它适用于第一级。但我需要递归多 D 数组。类似资产 -> 固定资产 --> 车辆
    猜你喜欢
    • 2016-12-16
    • 1970-01-01
    • 2010-12-27
    • 2015-12-22
    • 2014-12-30
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多