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

如何在多维数组中匹配name键值时合并marks与course键值?

解决PHP多维数组按name合并marks和course的问题

别急,我来给你捋捋怎么实现这个需求。首先咱们先拿一个和你描述匹配的示例数组来演示,方便你对照理解:

$multi = [
    ['name' => 'Alice', 'marks' => [85, 90], 'course' => ['Math', 'English']],
    ['name' => 'Bob', 'marks' => [78], 'course' => ['Physics']],
    ['name' => 'Charlie', 'marks' => [92], 'course' => ['Chemistry']],
    ['name' => 'Bob', 'marks' => [88], 'course' => ['Biology']],
];

这里第二个和第四个元素的name都是Bob,咱们要把他的marks合并成[78,88],course合并成['Physics','Biology']。

核心实现思路

咱们的核心逻辑是:用name作为唯一标识来分组,把相同name的元素里的marks和course合并到一起。具体来说就是通过遍历原数组,用一个临时数组按name存储数据,遇到重复name时就合并对应字段,最后再转回原数组的结构。

具体代码实现

// 初始化临时数组,用来按name分组存储数据
$merged = [];

foreach ($multi as $item) {
    $name = $item['name'];
    // 如果临时数组里还没有这个name的条目,直接添加
    if (!isset($merged[$name])) {
        $merged[$name] = $item;
    } else {
        // 合并marks数组,如果需要去重可以加上array_unique
        $merged[$name]['marks'] = array_merge($merged[$name]['marks'], $item['marks']);
        // 合并course数组,同理如果需要去重也可以用array_unique
        $merged[$name]['course'] = array_merge($merged[$name]['course'], $item['course']);
    }
}

// 把关联数组转回索引数组(如果需要保持原数组的索引形式)
$result = array_values($merged);

// 打印结果看看
print_r($result);

代码细节解释

  1. 临时数组分组:用$merged数组,键是每个元素的name值,这样能快速判断当前元素的name是否已经存在,避免重复遍历查找,效率更高。
  2. 合并逻辑:如果name不存在,直接把当前元素存入临时数组;如果存在,就用array_merge把两个元素的marks和course数组合并到一起——要是你需要合并后自动去重,就在array_merge外面套一层array_unique就行。
  3. 转回索引数组:最后用array_values把关联数组转成普通的索引数组,和原数组的结构保持一致,方便后续使用。

特殊情况处理

如果你的marks或course不是数组,而是字符串(比如marks是"78",course是"Physics"),那合并的时候就需要用字符串拼接的方式,比如:

$merged[$name]['marks'] .= ',' . $item['marks'];
$merged[$name]['course'] .= ',' . $item['course'];

不过更建议你把这些字段统一成数组格式,这样合并和后续的增删改查操作都会更灵活。

这样处理后,你就能得到按name合并后的完整数组啦,既保留了所有数据,又不会丢失重复name对应的内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:14:53