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

如何将键值为父ID的PHP数组构建为层级分类树结构

PHP实现父ID索引数组转缩进式层级分类树

实现思路

核心逻辑通过递归完成:

  • 从顶层父ID(固定为0)开始遍历
  • 每次遍历指定父ID下的所有子分类,按当前层级拼接缩进字符后输出分类名称
  • 检查当前子分类ID是否存在于原始数组的键中,存在则说明该分类还有下级,递归调用遍历逻辑,缩进层级+1即可

完整实现代码

<?php
// 填入你的完整原始分类数组即可
$categoryArray = [
    0 => [
        190 => 'Adana',
        58 => 'Ankara',
        199 => 'Antalya',
        205 => 'Aydın',
        226 => 'Kocaeli',
        228 => 'Mersin',
        233 => 'Nevşehir',
        236 => 'Sakarya',
        57 => 'İstanbul',
        56 => 'İzmir',
    ],
    57 => [
        420 => 'Anadolu Yakası',
        419 => 'Avrupa Yakası',
    ],
    419 => [
        158 => 'Avcılar',
        86 => 'Bahçelievler',
        160 => 'Bakırköy',
        87 => 'Bayrampaşa',
        161 => 'Başakşehir',
        162 => 'Beylikdüzü',
        163 => 'Beyoğlu',
        89 => 'Beşiktaş',
        164 => 'Büyükçekmece',
        503 => 'Esenyurt',
        95 => 'Eyüp',
        167 => 'Fatih',
        501 => 'Gaziosmanpaşa',
        96 => 'Güngören',
        422 => 'Kağıthane',
        176 => 'Küçükçekmece',
        103 => 'Sarıyer',
        542 => 'Silivri',
        508 => 'Sultangazi',
        189 => 'Zeytinburnu',
        105 => 'Şişli',
    ],
    420 => [
        172 => 'Adalar',
        85 => 'Ataşehir',
        90 => 'Beykoz',
        421 => 'Kadıköy',
        98 => 'Kartal',
        100 => 'Maltepe',
        102 => 'Pendik',
        536 => 'Tuzla',
        77 => 'Çekmeköy',
        187 => 'Ümraniye',
        107 => 'Üsküdar',
        104 => 'Şile',
    ],
    56 => [
        123 => 'Alsancak',
        215 => 'Balçova',
        124 => 'Bayraklı',
        125 => 'Bornova',
        216 => 'Buca',
        617 => 'Dikili',
        217 => 'Foça',
        218 => 'Gaziemir',
        220 => 'Güzelbahçe',
        507 => 'Karabağlar',
        128 => 'Karşıyaka',
        535 => 'Kemalpaşa',
        130 => 'Konak',
        222 => 'Menemen',
        132 => 'Narlıdere',
        223 => 'Seferihisar',
        559 => 'Tire',
        489 => 'Torbalı',
        225 => 'Urla',
        126 => 'Çeşme',
        127 => 'Çiğli',
    ],
    58 => [
        263 => 'Akyurt',
        428 => 'Altındağ',
        483 => 'Dikmen',
        116 => 'Etimesgut',
        117 => 'Gölbaşı',
        735 => 'Kahramankazan',
        459 => 'Keçiören',
        119 => 'Mamak',
        462 => 'Polatlı',
        120 => 'Pursaklar',
        430 => 'Sincan',
        122 => 'Yenimahalle',
        114 => 'Çankaya',
        453 => 'Çubuk',
        619 => 'Ümitköy',
    ],
    89 => [
        84 => 'Levent',
    ],
    117 => [
        520 => 'Kızılcaşar',
        195 => 'İncek',
    ],
    226 => [
        227 => 'Başiskele',
        625 => 'Gebze',
        667 => 'Kartepe',
    ],
    215 => [
        387 => 'İnciraltı',
    ],
    103 => [
        607 => 'Kilyos',
        178 => 'Maslak',
        106 => 'Tarabya',
    ],
    122 => [
        113 => 'Batıkent',
        198 => 'Ostim',
    ],
    216 => [
        129 => 'Kaynaklar',
    ],
    205 => [
        207 => 'Efeler',
        658 => 'Kuşadası',
        208 => 'Merkez',
    ],
    114 => [
        537 => 'Gaziosmanpaşa',
        118 => 'Kavaklıdere',
        197 => 'Söğütözü',
        115 => 'Çayyolu',
        623 => 'Çukurambar',
    ],
    100 => [
        177 => 'Küçükyalı',
        173 => 'İdealtepe',
    ],
    160 => [
        169 => 'Florya',
    ],
    163 => [
        524 => 'Karaköy',
    ],
    218 => [
        517 => 'Sarnıç',
    ],
    190 => [
        192 => 'Adnan Menderes',
        193 => 'Pozantı',
    ],
    96 => [
        602 => 'Merter',
    ],
    199 => [
        202 => 'Kaleiçi',
    ],
    228 => [
        230 => 'Merkez',
    ],
    126 => [
        544 => 'Dalyan',
    ],
    233 => [
        235 => 'Ürgüp',
    ],
    116 => [
        530 => 'Eryaman',
    ],
    236 => [
        237 => 'Sapanca',
    ],
    95 => [
        175 => 'Kemerburgaz',
    ],
    421 => [
        168 => 'Fenerbahçe',
    ],
    107 => [
        526 => 'Çamlıca',
    ],
    90 => [
        174 => 'Kavacık',
    ],
];

/**
 * 递归输出层级分类树
 * @param array $categoryArray 原始分类数组
 * @param int $parentId 当前遍历的父分类ID
 * @param int $indentLevel 当前缩进层级
 * @return void
 */
function printCategoryTree($categoryArray, $parentId = 0, $indentLevel = 0) {
    if (!isset($categoryArray[$parentId])) {
        return;
    }
    // 每层级缩进2个空格,可根据需求调整缩进字符和数量
    $indent = str_repeat(' ', $indentLevel * 2);
    foreach ($categoryArray[$parentId] as $catId => $catName) {
        echo $indent . $catName . PHP_EOL;
        // 递归遍历子分类的下级
        printCategoryTree($categoryArray, $catId, $indentLevel + 1);
    }
}

// 调用输出层级树
printCategoryTree($categoryArray);
?>

输出效果示例

执行代码后会输出符合要求的层级结构,片段如下:

İstanbul
  Anadolu Yakası
    Adalar
    Ataşehir
    Beykoz
      Kavacık
    Kadıköy
      Fenerbahçe
    Kartal
    Maltepe
      Küçükyalı
      İdealtepe
  Avrupa Yakası
    Avcılar
    Bahçelievler
    Bakırköy
      Florya
İzmir
  Alsancak
  Balçova
    İnciraltı

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:36:03