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

如何按键对PHP数组值分组并将键作为值纳入结果?

PHP数组按键分组并将键作为每组第一个值的实现方案

别担心,我来一步步帮你搞定这个需求!我明白你想要的是:把数组按指定的键进行分组,并且每组的第一个元素就是这个分组的键值,剩下的是对应分组的原始数据(去掉分组键后的内容)。

先明确需求示例

假设你有这样的原始数组:

$originalArray = [
    ['category' => 'Fruit', 'name' => 'Apple', 'color' => 'Red'],
    ['category' => 'Fruit', 'name' => 'Banana', 'color' => 'Yellow'],
    ['category' => 'Vegetable', 'name' => 'Carrot', 'color' => 'Orange'],
    ['category' => 'Vegetable', 'name' => 'Spinach', 'color' => 'Green'],
];

你期望得到的分组结果是:

$groupedArray = [
    [
        'Fruit', // 分组键作为第一个值
        ['name' => 'Apple', 'color' => 'Red'],
        ['name' => 'Banana', 'color' => 'Yellow'],
    ],
    [
        'Vegetable',
        ['name' => 'Carrot', 'color' => 'Orange'],
        ['name' => 'Spinach', 'color' => 'Green'],
    ],
];

具体实现代码

下面是直接可用的代码,我会逐行解释逻辑:

// 初始化空数组,用来存储分组后的结果
$groupedArray = [];

// 遍历原始数组的每一项
foreach ($originalArray as $item) {
    // 取出用来分组的键值(这里假设按'category'分组,你可以换成自己的键名)
    $groupKey = $item['category'];
    
    // 如果当前分组还不存在,就先创建这个分组,并且把分组键作为第一个元素
    if (!isset($groupedArray[$groupKey])) {
        $groupedArray[$groupKey] = [$groupKey];
    }
    
    // 从当前项中移除分组键,只保留其他数据
    unset($item['category']);
    
    // 把处理后的当前项追加到对应分组里
    $groupedArray[$groupKey][] = $item;
}

// 可选:如果不需要保留原分组的字符串键(比如'Fruit'、'Vegetable'),转成数字索引数组
$groupedArray = array_values($groupedArray);

// 输出结果看看
print_r($groupedArray);

代码逻辑解释

  1. 初始化容器:先创建一个空数组$groupedArray,用来装最终的分组结果。
  2. 遍历原始数据:逐个处理数组里的每一项。
  3. 创建分组:如果当前分组还没在容器里,就先创建一个新数组,并且把分组键值作为这个数组的第一个元素。
  4. 清理数据:把当前项里的分组键删掉,避免重复显示。
  5. 追加数据:把清理后的当前项加到对应分组的末尾。
  6. 可选的索引转换:如果不需要原有的字符串键,用array_values()把数组转成数字索引,让结果更符合你的预期。

封装成可复用的函数(更灵活)

如果你需要经常做这个操作,可以把逻辑封装成函数,方便随时调用:

/**
 * 数组按键分组,并将分组键作为每组的第一个元素
 * @param array $array 原始数组
 * @param string $groupKey 用来分组的键名
 * @return array 分组后的结果
 */
function groupArrayWithKeyAsFirstItem($array, $groupKey) {
    $groupedResult = [];
    
    foreach ($array as $item) {
        // 跳过没有指定分组键的项(避免报错)
        if (!isset($item[$groupKey])) {
            continue;
        }
        
        $keyValue = $item[$groupKey];
        
        // 初始化分组
        if (!isset($groupedResult[$keyValue])) {
            $groupedResult[$keyValue] = [$keyValue];
        }
        
        // 移除分组键并追加数据
        unset($item[$groupKey]);
        $groupedResult[$keyValue][] = $item;
    }
    
    // 转成数字索引数组返回
    return array_values($groupedResult);
}

// 使用示例
$result = groupArrayWithKeyAsFirstItem($originalArray, 'category');
print_r($result);

为什么之前的SO方案没成功?

你提到之前看的SO问题方案没生效,大概率是那些方案只是单纯做了按键分组(比如把分组键作为结果数组的键,对应值是分组后的列表),但没有额外把分组键作为每组的第一个元素。上面的方案专门针对这个需求做了处理,应该能解决你的问题~

内容的提问来源于stack exchange,提问作者Ashe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:02:19