You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将层级嵌套数组转换为独立的select输入框?

多层级嵌套数组生成独立Select输入框解决方案

问题描述

我有一个多层级嵌套数组,每一层对应一个层级结构,需要为每个层级生成独立的<select>输入框,每个嵌套层级都包含父ID字段。

示例数据:

$data = [
  "group1" => [
        "group_id" => 0,
        "subgroup1" => [
            "subgroup_id" => 0,
            "unit1" => [
                "unit_id" => 0,
                "subunit1" => [
                    "subunit_id" => 0
                ],    
            ],
            "unit2" => [
                "unit_id" => 1,
                "subunit2" => [
                    "subunit_id" => 1
                ],        
        ],     
    ],
    
    "subgroup2" => [
        "subgroup_id" => 1,
        "unit3" =>  [
            "unit_id" => 2,
            "subunit3" =>  [
                "subunit_id" => 2
            ],        
        ],
        "unit4" => [
            "unit_id" => 3,
            "subunit4" => [     
                "subunit_id" => 3
        ],       
      ],      
    ],    
  ]

期望生成的HTML效果:

<select>
    <option>group1</option>
    <option>group2</option>
</select>

<select>
    <option class="group_id_0">subgroup1</option> <!-- group_id 对应父级分组ID -->
    <option class="group_id_1">subgroup2</option>
</select>

尝试过嵌套foreach循环,但因每个select是独立的,无法实现需求。

解决方案

核心思路是先将每个层级的选项数据(名称、父ID)单独提取并按层级存储,之后再逐个生成独立的select框。以下是具体PHP实现:

<?php
// 示例数据
$data = [
  "group1" => [
        "group_id" => 0,
        "subgroup1" => [
            "subgroup_id" => 0,
            "unit1" => [
                "unit_id" => 0,
                "subunit1" => [
                    "subunit_id" => 0
                ],    
            ],
            "unit2" => [
                "unit_id" => 1,
                "subunit2" => [
                    "subunit_id" => 1
                ],        
        ],     
    ],
    
    "subgroup2" => [
        "subgroup_id" => 1,
        "unit3" =>  [
            "unit_id" => 2,
            "subunit3" =>  [
                "subunit_id" => 2
            ],        
        ],
        "unit4" => [
            "unit_id" => 3,
            "subunit4" => [     
                "subunit_id" => 3
        ],       
      ],      
    ],    
  ];

// 存储各层级选项数据
$levels = [];

// 提取第一层:分组
$levels[0] = [];
foreach ($data as $groupName => $groupData) {
    $levels[0][] = [
        'name' => $groupName,
        'parent_id' => $groupData['group_id']
    ];
}

// 提取第二层:子分组
$levels[1] = [];
foreach ($data as $groupData) {
    foreach ($groupData as $key => $value) {
        if ($key === 'group_id') continue;
        $levels[1][] = [
            'name' => $key,
            'parent_id' => $groupData['group_id']
        ];
    }
}

// 提取第三层:单元
$levels[2] = [];
foreach ($data as $groupData) {
    foreach ($groupData as $subgroupKey => $subgroupData) {
        if ($subgroupKey === 'group_id') continue;
        foreach ($subgroupData as $key => $value) {
            if ($key === 'subgroup_id') continue;
            $levels[2][] = [
                'name' => $key,
                'parent_id' => $subgroupData['subgroup_id']
            ];
        }
    }
}

// 提取第四层:子单元
$levels[3] = [];
foreach ($data as $groupData) {
    foreach ($groupData as $subgroupKey => $subgroupData) {
        if ($subgroupKey === 'group_id') continue;
        foreach ($subgroupData as $unitKey => $unitData) {
            if ($unitKey === 'subgroup_id') continue;
            foreach ($unitData as $key => $value) {
                if ($key === 'unit_id') continue;
                $levels[3][] = [
                    'name' => $key,
                    'parent_id' => $unitData['unit_id']
                ];
            }
        }
    }
}

// 生成每个层级的select框
foreach ($levels as $levelIndex => $options) {
    echo "<select>\n";
    foreach ($options as $opt) {
        $parentClass = '';
        // 根据层级设置对应父ID类名
        match($levelIndex) {
            1 => $parentClass = "group_id_{$opt['parent_id']}",
            2 => $parentClass = "subgroup_id_{$opt['parent_id']}",
            3 => $parentClass = "unit_id_{$opt['parent_id']}",
        };
        $classAttr = $parentClass ? " class=\"{$parentClass}\"" : '';
        echo "    <option{$classAttr}>{$opt['name']}</option>\n";
    }
    echo "</select>\n\n";
}
?>

代码说明

  • 先将每个层级的选项数据提取到$levels数组,每个索引对应一个层级的所有选项(包含名称和父ID)。
  • 遍历$levels数组,为每个层级生成独立的<select>标签,并根据层级为<option>添加对应的父ID类名。
  • 若层级更多或数据结构调整,只需扩展对应层级的提取逻辑即可。

内容的提问来源于stack exchange,提问作者pileup

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 04:31:06