
本文介绍如何将包含分类信息的二维文章数组,按 category 字段高效分组,并生成结构清晰的 html 输出(如每个分类标题下罗列对应文章标题)。核心方法是使用关联数组重构数据结构,再遍历渲染。
本文介绍如何将包含分类信息的二维文章数组,按 category 字段高效分组,并生成结构清晰的 html 输出(如每个分类标题下罗列对应文章标题)。核心方法是使用关联数组重构数据结构,再遍历渲染。
在实际开发中(例如职位列表页、博客归档页),我们常需将扁平化的文章/岗位数据按分类聚合展示。原始数据是一个二维数组,每项含 title、category 和 link 字段。直接遍历渲染会导致重复判断分类、逻辑冗余且难以维护。最佳实践是先「分组归类」,再「结构化输出」。
✅ 正确做法:两步法分组渲染
首先,构建以 category 为键、对应文章标题(或完整数据)为值的嵌套数组。注意:一个分类下可能有多个文章,因此应使用 数组追加 而非简单赋值:
// 假设 $posts 是原始文章数组
$grouped = [];
foreach ($posts as $post) {
$cat = $post['category'];
if (!isset($grouped[$cat])) {
$grouped[$cat] = [];
}
$grouped[$cat][] = $post; // 保留完整数据,便于后续扩展(如显示 link)
}接着,遍历 $grouped 数组,按分类输出 HTML 结构:
foreach ($grouped as $category => $postsInCat) {
echo "<h2>" . htmlspecialchars($category) . ":</h2>\n";
foreach ($postsInCat as $post) {
$title = htmlspecialchars($post['title']);
$link = htmlspecialchars($post['link']);
echo "<p><a href=\"{$link}\">{$title}</a></p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/7fc7563c4182" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">PHP免费学习笔记(深入)</a>”;</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站"><img
src="https://img.php.cn/upload/skill/000/000/081/179040786932301.jpg" alt="btpanel phpsite 宝塔面板PHP网站" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站">btpanel phpsite 宝塔面板PHP网站</a>
<p>宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理</p>
</div>
<a href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div>\n";
}
}⚠️ 安全提示:务必使用
htmlspecialchars()对输出内容进行转义,防止 XSS 攻击——尤其当title或link来自用户输入或数据库时。
❌ 原答案的问题与修正说明
原回答中存在两个关键缺陷:
-
"$output[$job['category']] = $job['title'];"会覆盖同分类的多个标题(因键重复),导致仅保留最后一个; - 后续循环误将
$output当作分类键数组再次遍历,逻辑错乱且无法运行。
因此,不可直接复用原代码。正确方案必须支持多值存储(即每个分类对应一个子数组),推荐使用 [] 追加语法或 array_push()。
✨ 进阶建议
- 若需保持分类顺序(如按首次出现顺序),可额外维护
$categories = array_keys($grouped)并去重; - 如需支持多级分类或动态模板,可封装为函数:
function renderPostsByCategory(array $posts, callable $renderItem = null): void { $grouped = array_reduce($posts, function($carry, $post) { $cat = $post['category'] ?? 'Uncategorized'; $carry[$cat][] = $post; return $carry; }, []); // ... 渲染逻辑 }
通过合理分组与安全渲染,即可优雅实现分类驱动的内容展示,兼顾可读性、可维护性与安全性。


















