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

如何在二维数组中新增列统计另一二维数组的关联值数量?

正确实现区域邮件统计的PHP方法

需求回顾

将两个二维数组$incomingMail(邮件数据,含title、areaCode)和$areaArr(区域信息,含name、code)合并,生成$areaWithMailCount数组,新增mailCount字段统计对应区域的邮件数(无对应邮件则为0)。

示例数据

// 邮件数组示例
$incomingMail = [
    ['title' => '邮件1', 'areaCode' => '001'],
    ['title' => '邮件2', 'areaCode' => '002'],
    ['title' => '邮件3', 'areaCode' => '001'],
    ['title' => '邮件4', 'areaCode' => '003'],
];

// 区域数组示例
$areaArr = [
    ['name' => '北京', 'code' => '001'],
    ['name' => '上海', 'code' => '002'],
    ['name' => '广州', 'code' => '003'],
    ['name' => '深圳', 'code' => '004'],
];

高效实现方案(推荐)

先预处理邮件数组统计各区域邮件数,再遍历区域数组赋值,时间复杂度更低(O(n+m)):

// 1. 预处理:统计每个区域的邮件数量
$mailCountMap = [];
foreach ($incomingMail as $mail) {
    $code = $mail['areaCode'];
    $mailCountMap[$code] = isset($mailCountMap[$code]) ? $mailCountMap[$code] + 1 : 1;
}

// 2. 生成带统计的区域数组
$areaWithMailCount = [];
foreach ($areaArr as $area) {
    $areaCode = $area['code'];
    $count = isset($mailCountMap[$areaCode]) ? $mailCountMap[$areaCode] : 0;
    
    $areaWithMailCount[] = [
        'name' => $area['name'],
        'code' => $areaCode,
        'mailCount' => $count
    ];
}

// 输出结果
print_r($areaWithMailCount);

执行后输出:

Array
(
    [0] => Array
        (
            [name] => 北京
            [code] => 001
            [mailCount] => 2
        )

    [1] => Array
        (
            [name] => 上海
            [code] => 002
            [mailCount] => 1
        )

    [2] => Array
        (
            [name] => 广州
            [code] => 003
            [mailCount] => 1
        )

    [3] => Array
        (
            [name] => 深圳
            [code] => 004
            [mailCount] => 0
        )
)

嵌套循环的正确写法

如果一定要用嵌套循环,需注意每次外层循环都初始化计数为0,避免累加错误:

$areaWithMailCount = [];
foreach ($areaArr as $area) {
    $count = 0; // 关键:每个区域单独初始化计数
    foreach ($incomingMail as $mail) {
        if ($mail['areaCode'] === $area['code']) {
            $count++;
        }
    }
    
    $areaWithMailCount[] = [
        'name' => $area['name'],
        'code' => $area['code'],
        'mailCount' => $count
    ];
}

常见错误分析

多数嵌套循环失败的原因是计数变量未在每次外层循环初始化,比如错误代码:

// 错误示例:count仅初始化一次,导致计数累加所有区域邮件
$areaWithMailCount = [];
$count = 0;
foreach ($areaArr as $area) {
    foreach ($incomingMail as $mail) {
        if ($mail['areaCode'] === $area['code']) {
            $count++;
        }
    }
    $areaWithMailCount[] = [..., 'mailCount' => $count];
}

这种写法会让后续区域的mailCount累加之前所有区域的邮件数,完全不符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 16:46:13