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

如何从SharedDevice对象数组中获取最低频的device_id?含特殊规则

问题修复与解决方案

原代码存在的问题

  1. 对象访问错误:代码用数组索引方式($arr[$i]['device_ip_isp'])访问对象属性,但SharedDevice是对象,需使用箭头操作符->(如$arr[$i]->device_ip_isp)。
  2. 依赖数组排序:循环逻辑默认数组已按device_ip_isp分组排序,若数组无序,频率统计会完全错误。
  3. 返回语句语法错误:return $arr[$n]$res['device_id'];存在语法错误,逻辑也不成立。
  4. 未处理特殊规则:未实现“数组仅含两个不同ISP的对象时返回第二个对象ID”的规则。

修正后的代码

/*
 $user->getUser_devices() 返回题目中的SharedDevice对象数组
*/

$devices = $user->getUser_devices();
echo leastFrequent($devices);

function leastFrequent($arr) {
    $deviceCount = count($arr);
    
    // 处理特殊规则:两个不同ISP的对象,返回第二个的device_id
    if ($deviceCount === 2) {
        if ($arr[0]->device_ip_isp !== $arr[1]->device_ip_isp) {
            return $arr[1]->device_id;
        }
    }

    // 统计每个ISP的出现频率,以及对应的device_id列表
    $ispFrequency = [];
    $ispToDeviceIds = [];
    foreach ($arr as $device) {
        $isp = $device->device_ip_isp;
        if (!isset($ispFrequency[$isp])) {
            $ispFrequency[$isp] = 0;
            $ispToDeviceIds[$isp] = [];
        }
        $ispFrequency[$isp]++;
        $ispToDeviceIds[$isp][] = $device->device_id;
    }

    // 找到最低出现频率
    $minFreq = min($ispFrequency);
    // 获取所有出现频率最低的ISP
    $lowestFreqIsps = array_keys($ispFrequency, $minFreq);

    // 返回第一个低频ISP对应的第一个device_id(若需返回所有,可改为返回$ispToDeviceIds[$lowestFreqIsps[0]])
    return $ispToDeviceIds[$lowestFreqIsps[0]][0];
}

代码说明

  1. 特殊规则优先处理:先判断数组长度是否为2且两个对象ISP不同,直接返回第二个对象的ID。
  2. 频率统计:遍历数组统计每个ISP的出现次数,并记录对应的设备ID列表,无需依赖数组排序。
  3. 找到最低频项:通过min()获取最低频率,再筛选出所有符合该频率的ISP,最后返回对应设备ID。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 10:50:18