PHP如何用单次循环计算多维数组分组后的position字段平均值
实现方案
完全可以仅通过一次遍历原始数组实现需求,核心思路是将URL和关键词拼接为唯一分组键,在遍历过程中实时计算当前分组的position平均值,避免后续二次遍历分组结果。
调整逻辑
- 把去参数后的URL和关键词拼接成唯一字符串作为分组键,让分组结果直接存储为一维结构,省去后续拍平二维数组的步骤
- 分组存储时新增临时字段
count和position_sum,分别记录当前分组的匹配次数和position累加值,不和最终输出的字段混淆 - 每次匹配到相同分组时,先累加各分数、匹配次数和position总和,再直接用总和除以当前匹配次数得到最新平均值,赋值给
position字段 - 遍历完所有原始数据后,直接通过
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
相关产品推荐
相关产品推荐

