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

PHP:如何合并多维数组中product_id匹配的内部数组并整合字段?

如何合并PHP多维数组中相同product_id的字段?

其实PHP里没有专门干这个的「一键式」函数,但我们可以通过循环遍历+数组分组的方式轻松实现你的需求,思路非常清晰,我给你一步步拆解:

首先,先明确你的原始数组(我整理成更易读的格式):

$originalArray = [
    ['product_id' => 1, 'name' => 'size', 'lang_key' => 'en', 'value' => 'Medium'],
    ['product_id' => 1, 'name' => 'colour', 'lang_key' => 'en', 'value' => 'Orange'],
    ['product_id' => 2, 'name' => 'size', 'lang_key' => 'en', 'value' => 'Medium'],
    ['product_id' => 2, 'name' => 'colour', 'lang_key' => 'en', 'value' => 'Green'],
    ['product_id' => 3, 'name' => 'size', 'lang_key' => 'en', 'value' => 'Medium'],
    ['product_id' => 3, 'name' => 'colour', 'lang_key' => 'en', 'value' => 'Pink'],
];

完整实现代码

$mergedArray = [];

foreach ($originalArray as $item) {
    $productId = $item['product_id'];
    $langKey = $item['lang_key'];
    
    // 初始化当前product_id的基础结构(如果还没处理过)
    if (!isset($mergedArray[$productId])) {
        $mergedArray[$productId] = [
            'product_id' => $productId,
            'lang_key' => $langKey,
            'value' => ''
        ];
    }
    
    // 格式化name(首字母大写)并拼接value内容
    $formattedName = ucfirst($item['name']);
    $mergedArray[$productId]['value'] .= ($mergedArray[$productId]['value'] ? ', ' : '') . "$formattedName: {$item['value']}";
}

// 将关联数组转为索引数组(匹配你要的最终结构)
$mergedArray = array_values($mergedArray);

// 查看结果
print_r($mergedArray);

代码逻辑解释

  1. 临时分组存储:用$mergedArray作为临时容器,以product_id为键,这样能快速判断当前商品是否已经被处理过,避免重复创建结构。
  2. 初始化基础结构:第一次遇到某个product_id时,先创建包含product_id、lang_key和空value的基础数组。
  3. 拼接字段内容:把每个item的name首字母大写(和你要的输出格式一致),然后拼接成Name: Value的格式,通过三元表达式处理第一个元素不需要前置逗号的问题。
  4. 转为索引数组:最后用array_values()把以product_id为键的关联数组转为纯索引数组,完全匹配你想要的最终结构。

额外扩展提示

如果你的数组中存在同一product_id但不同lang_key的情况,只需要把临时键改成$productId . '_' . $langKey,就能区分不同语言的商品数据,避免混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:30:50