求助:如何用PHP按分类分组展示文章数组
按分类整理文章标题列表的实现方案
需求描述
现有一个包含文章的PHP数组,每篇文章包含title、category、link字段,需要按分类分组输出文章标题:每个分类作为<h2>标题,对应文章标题以<p>标签展示,分类顺序为Cat 1、Cat 2、Cat 3,每个分类下的文章标题按数字升序排列。
原始数组示例
$articles = [ [ "title" => "Test Job 8", "category" => "Cat 3", "link" => "https://example.com/vacancies/test-job-8/" ], [ "title" => "Test Job 7", "category" => "Cat 3", "link" => "https://example.com/vacancies/test-job-7/" ], [ "title" => "Test Job 6", "category" => "Cat 3", "link" => "https://example.com/vacancies/test-job-6/" ], [ "title" => "Test Job 5", "category" => "Cat 2", "link" => "https://example.com/vacancies/test-job-5/" ], [ "title" => "Test Job 4", "category" => "Cat 2", "link" => "https://example.com/vacancies/test-job-4/" ], [ "title" => "Test Job 3", "category" => "Cat 2", "link" => "https://example.com/vacancies/test-job-3/" ], [ "title" => "Test Job 2", "category" => "Cat 1", "link" => "https://example.com/vacancies/test-job-2/" ], [ "title" => "Test Job 1", "category" => "Cat 1", "link" => "https://example.com/vacancies/test-job-1/" ] ];
期望输出HTML
<h2>Cat 1:</h2> <p>Test Job 1</p> <p>Test Job 2</p> <h2>Cat 2:</h2> <p>Test Job 3</p> <p>Test Job 4</p> <p>Test Job 5</p> <h2>Cat 3:</h2> <p>Test Job 6</p> <p>Test Job 7</p> <p>Test Job 8</p>
最优实现方案
步骤1:按分类分组数组
遍历原始数组,将同一分类的文章归为一组,键为分类名称,值为对应文章数组:
// 按分类分组 $grouped = []; foreach ($articles as $article) { $category = $article['category']; if (!isset($grouped[$category])) { $grouped[$category] = []; } $grouped[$category][] = $article; } // 或用更简洁的array_reduce写法 // $grouped = array_reduce($articles, function($carry, $item) { // $carry[$item['category']][] = $item; // return $carry; // }, []);
步骤2:排序分类与文章
- 对分类名称升序排序,保证Cat 1到Cat 3的顺序;
- 对每个分类下的文章按标题升序排序,实现文章数字从小到大排列:
// 对分类名称排序 ksort($grouped); // 对每个分类下的文章按标题排序 foreach ($grouped as &$categoryArticles) { usort($categoryArticles, function($a, $b) { return strcmp($a['title'], $b['title']); }); } unset($categoryArticles); // 释放引用,避免后续变量污染
步骤3:输出目标HTML
遍历分组后的数组,按要求输出对应HTML标签:
// 输出结果 foreach ($grouped as $category => $articles) { echo "<h2>{$category}:</h2>\n"; foreach ($articles as $article) { echo "<p>{$article['title']}</p>\n"; } echo "\n"; // 分类间添加换行,保持输出格式整洁 }
方案优势
- 高效性:仅需三次核心遍历(分组、排序、输出),时间复杂度为O(n log n)(主要来自排序操作),适配多数数据规模;
- 可读性:逻辑拆分清晰,分步骤实现,便于后续维护修改;
- 灵活性:若需调整排序规则或输出格式,仅需修改对应步骤的代码即可。
内容的提问来源于stack exchange,提问作者fish_r
相关产品推荐
相关产品推荐

