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

求助:如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:50:35