PHP用foreach按字母数字排序分组展示分类并为空分组加自定义CSS方法
你可以按照以下步骤实现需求:
- 先初始化完整的分组列表,包含#(对应数字开头分类)和A-Z的所有字母,确保所有分组都能正常输出,不会遗漏无分类的分组
- 遍历子分类集合,按分类名首字符将分类归入对应分组:首字符为数字就归入#组,非数字则转成大写后归入对应字母组
- 遍历初始化好的全部分组渲染页面结构,分组下有分类时输出子列表,无分类时给外层li加
landing-pages-list-item-no-items自定义类
完整实现代码如下:
<?php // 1. 初始化全部分组,先加#(对应数字开头的分类),再加入A-Z所有字母 $groups = []; $groups['#'] = []; for ($i = 65; $i <= 90; $i++) { $groups[chr($i)] = []; } // 2. 将子分类按首字符分配到对应分组 foreach ($subcategories as $subcat) { $catName = $subcat->getName(); // 提取名称第一个字符,转大写,适配UTF-8编码避免中文/特殊字符乱码 $firstChar = mb_strtoupper(mb_substr($catName, 0, 1, 'UTF-8')); // 判断首字符是否为数字 if (is_numeric($firstChar)) { $groups['#'][] = $subcat; } else { // 非数字字符如果是A-Z范围内归入对应分组,其他特殊字符默认归入#组,可按需调整 if (isset($groups[$firstChar])) { $groups[$firstChar][] = $subcat; } else { $groups['#'][] = $subcat; } } } ?> <!-- 3. 渲染最终的分组页面结构 --> <ol class="landing-pages-list landing-pages-list-4-columns"> <?php foreach ($groups as $groupKey => $groupItems): ?> <li class="landing-pages-list-item <?php if (empty($groupItems)) echo 'landing-pages-list-item-no-items' ?>"> <h3 class="landing-pages-list-title"><?php echo $groupKey ?></h3> <?php if (!empty($groupItems)): ?> <ol class="landing-pages-list"> <?php foreach ($groupItems as $subcat): ?> <li class="landing-pages-list"> <a href="<?php echo $subcat->getUrl(); ?>" title="<?php echo $subcat->getName(); ?>"> <?php echo $subcat->getName(); ?> </a> </li> <?php endforeach; ?> </ol> <?php endif; ?> </li> <?php endforeach; ?> </ol>
如果你的分类名包含非英文的特殊字符,可以根据业务需求调整字符判断逻辑,比如将非A-Z非数字的字符单独新增分组处理即可。
内容的提问来源于stack exchange,提问作者JGeer
相关产品推荐
相关产品推荐

