PHP二维数组按条件取值:修正最低延迟匹配逻辑问题
PHP二维数组最低延迟筛选逻辑修复
问题背景与需求
- 数组结构:二维数组
$g的每个元素字段对应关系:- 索引0:ID
- 索引5:delay(延迟值)
- 索引6:binary(仅0或1)
- 索引7:category(分类标识)
- 索引8:weight(权重值)
- 核心需求:
对每个ID分别处理最高延迟和最低延迟两个场景:- 每个场景下,需同时找到该ID下binary=0和binary=1的对应条目
- 优先筛选对应场景(最高/最低)的延迟值;若多个category的延迟差≤60,必须选择同一category下binary0和1的weight差值最小的组合
现有代码仅能正确处理最高延迟场景,最低延迟场景输出与最高延迟完全一致,需修正逻辑。
修正后的代码实现
<?php // 初始化结果存储数组 $result = []; // 第一步:按ID分组,整理每个ID下的所有条目 $groupedById = []; foreach ($g as $item) { $id = $item[0]; if (!isset($groupedById[$id])) { $groupedById[$id] = [ 'bin0' => [], 'bin1' => [] ]; } $binKey = $item[6] == 0 ? 'bin0' : 'bin1'; $groupedById[$id][$binKey][] = [ 'delay' => $item[5], 'category' => $item[7], 'weight' => $item[8] ]; } // 处理每个ID的最高/最低延迟场景 foreach ($groupedById as $id => $bins) { // 跳过缺少任意binary组的ID if (empty($bins['bin0']) || empty($bins['bin1'])) { continue; } // -------------------------- // 1. 最高延迟场景处理 // -------------------------- // 找出bin0和bin1中的最高延迟值 $maxDelay0 = max(array_column($bins['bin0'], 'delay')); $maxDelay1 = max(array_column($bins['bin1'], 'delay')); // 确定最高延迟的阈值(取两者最大值,允许±60的范围) $maxThreshold = max($maxDelay0, $maxDelay1); $maxMinDelay = $maxThreshold - 60; // 筛选bin0和bin1中延迟在阈值范围内的条目 $candidatesMax0 = array_filter($bins['bin0'], function($item) use ($maxMinDelay, $maxThreshold) { return $item['delay'] >= $maxMinDelay && $item['delay'] <= $maxThreshold; }); $candidatesMax1 = array_filter($bins['bin1'], function($item) use ($maxMinDelay, $maxThreshold) { return $item['delay'] >= $maxMinDelay && $item['delay'] <= $maxThreshold; }); // 寻找同category下weight差值最小的组合 $bestMax = null; $minDiffMax = PHP_INT_MAX; foreach ($candidatesMax0 as $c0) { foreach ($candidatesMax1 as $c1) { if ($c0['category'] != $c1['category']) { continue; } $diff = abs($c0['weight'] - $c1['weight']); if ($diff < $minDiffMax) { $minDiffMax = $diff; $bestMax = [ 'category' => $c0['category'], 'bin0_weight' => $c0['weight'], 'bin1_weight' => $c1['weight'], 'delay' => max($c0['delay'], $c1['delay']) ]; } } } // -------------------------- // 2. 最低延迟场景处理(修正核心逻辑) // -------------------------- // 找出bin0和bin1中的最低延迟值 $minDelay0 = min(array_column($bins['bin0'], 'delay')); $minDelay1 = min(array_column($bins['bin1'], 'delay')); // 确定最低延迟的阈值(取两者最小值,允许±60的范围) $minThreshold = min($minDelay0, $minDelay1); $maxMinDelayVal = $minThreshold + 60; // 筛选bin0和bin1中延迟在阈值范围内的条目 $candidatesMin0 = array_filter($bins['bin0'], function($item) use ($minThreshold, $maxMinDelayVal) { return $item['delay'] >= $minThreshold && $item['delay'] <= $maxMinDelayVal; }); $candidatesMin1 = array_filter($bins['bin1'], function($item) use ($minThreshold, $maxMinDelayVal) { return $item['delay'] >= $minThreshold && $item['delay'] <= $maxMinDelayVal; }); // 寻找同category下weight差值最小的组合 $bestMin = null; $minDiffMin = PHP_INT_MAX; foreach ($candidatesMin0 as $c0) { foreach ($candidatesMin1 as $c1) { if ($c0['category'] != $c1['category']) { continue; } $diff = abs($c0['weight'] - $c1['weight']); if ($diff < $minDiffMin) { $minDiffMin = $diff; $bestMin = [ 'category' => $c0['category'], 'bin0_weight' => $c0['weight'], 'bin1_weight' => $c1['weight'], 'delay' => min($c0['delay'], $c1['delay']) ]; } } } // 存入结果 $result[$id] = [ 'max_delay' => $bestMax, 'min_delay' => $bestMin ]; } // 示例输出ID18572的最低延迟结果 if (isset($result[18572]['min_delay'])) { $minItem = $result[18572]['min_delay']; echo "cat: {$minItem['category']}, Bin 0: {$minItem['bin0_weight']}, Bin 1: {$minItem['bin1_weight']}, Delay: {$minItem['delay']}"; } ?>
关键修正点
- 单独拆分最低延迟场景的逻辑:
- 取binary0和binary1中的最小延迟值作为基准阈值
- 筛选延迟范围为
[最小延迟值, 最小延迟值+60]的条目 - 最终记录的延迟取该组合中的最小延迟值
- 确保最高/最低场景的筛选逻辑完全独立,避免复用变量导致的逻辑混淆
内容的提问来源于stack exchange,提问作者reader54
相关产品推荐
相关产品推荐

