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

PHP如何用单次循环计算多维数组分组后的position字段平均值

实现方案

完全可以仅通过一次遍历原始数组实现需求,核心思路是将URL和关键词拼接为唯一分组键,在遍历过程中实时计算当前分组的position平均值,避免后续二次遍历分组结果。

调整逻辑

  1. 把去参数后的URL和关键词拼接成唯一字符串作为分组键,让分组结果直接存储为一维结构,省去后续拍平二维数组的步骤
  2. 分组存储时新增临时字段count和position_sum,分别记录当前分组的匹配次数和position累加值,不和最终输出的字段混淆
  3. 每次匹配到相同分组时,先累加各分数、匹配次数和position总和,再直接用总和除以当前匹配次数得到最新平均值,赋值给position字段
  4. 遍历完所有原始数据后,直接通过array_map清除临时字段即可得到最终结果,无需手动编写二次循环

实现代码

<?php
$keywordsUrlsArray = [
    0 => [
        'url' => 'https://www.example.pl/?test=19',
        'keyword' => 'test',
        'score1' => 100,
        'score2' => 50,
        'position' => 4
    ],
    1 => [
        'url' => 'https://www.example.pl/?test=2',
        'keyword' => 'test',
        'score1' => 100,
        'score2' => 50,
        'position' => 1
    ],
    2 => [
        'url' => 'https://www.example.pl/?test=3',
        'keyword' => 'test',
        'score1' => 100,
        'score2' => 50,
        'position' => 3
    ],
    3 => [
        'url' => 'https://www.example.pl/other-site?test=3',
        'keyword' => 'test',
        'score1' => 100,
        'score2' => 50,
        'position' => 3
    ]
];

$res = [];
foreach ($keywordsUrlsArray as $urlResults) {
    // 移除URL参数
    $parsedUrl = parse_url($urlResults['url']);
    $parsedUrl = $parsedUrl['scheme'] . '://' . $parsedUrl['host'] . $parsedUrl['path'];
    $keyword = $urlResults['keyword'];
    // 拼接唯一分组键
    $groupKey = $parsedUrl . '||' . $keyword;

    if (isset($res[$groupKey])) {
        // 已存在相同分组,累加数值并更新平均值
        $item = &$res[$groupKey];
        $item['count']++;
        $item['score1'] += $urlResults['score1'];
        $item['score2'] += $urlResults['score2'];
        $item['position_sum'] += $urlResults['position'];
        $item['position'] = $item['position_sum'] / $item['count'];
        continue;
    }
    // 初始化新分组
    $res[$groupKey] = [
        'url' => $parsedUrl,
        'keyword' => $keyword,
        'score1' => $urlResults['score1'],
        'score2' => $urlResults['score2'],
        'position' => $urlResults['position'],
        'count' => 1,
        'position_sum' => $urlResults['position']
    ];
}

// 清除临时字段得到最终结果
$result = array_map(function($item) {
    unset($item['count'], $item['position_sum']);
    return $item;
}, array_values($res));

var_dump($result);
return $result;

上述代码输出结果和你原有实现完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:36:01