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

PHP二维数组按条件取值:修正最低延迟匹配逻辑问题

PHP二维数组最低延迟筛选逻辑修复

问题背景与需求

  • 数组结构:二维数组$g的每个元素字段对应关系:
    • 索引0:ID
    • 索引5:delay(延迟值)
    • 索引6:binary(仅0或1)
    • 索引7:category(分类标识)
    • 索引8:weight(权重值)
  • 核心需求:
    对每个ID分别处理最高延迟和最低延迟两个场景:
    1. 每个场景下,需同时找到该ID下binary=0和binary=1的对应条目
    2. 优先筛选对应场景(最高/最低)的延迟值;若多个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']}";
}
?>

关键修正点

  • 单独拆分最低延迟场景的逻辑:
    1. 取binary0和binary1中的最小延迟值作为基准阈值
    2. 筛选延迟范围为[最小延迟值, 最小延迟值+60]的条目
    3. 最终记录的延迟取该组合中的最小延迟值
  • 确保最高/最低场景的筛选逻辑完全独立,避免复用变量导致的逻辑混淆

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:15:57