如何将键值为父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
相关产品推荐
相关产品推荐

