如何从SharedDevice对象数组中获取最低频的device_id?含特殊规则
问题修复与解决方案
原代码存在的问题
- 对象访问错误:代码用数组索引方式(
$arr[$i]['device_ip_isp'])访问对象属性,但SharedDevice是对象,需使用箭头操作符->(如$arr[$i]->device_ip_isp)。 - 依赖数组排序:循环逻辑默认数组已按
device_ip_isp分组排序,若数组无序,频率统计会完全错误。 - 返回语句语法错误:
return $arr[$n]$res['device_id'];存在语法错误,逻辑也不成立。 - 未处理特殊规则:未实现“数组仅含两个不同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]; }
代码说明
- 特殊规则优先处理:先判断数组长度是否为2且两个对象ISP不同,直接返回第二个对象的ID。
- 频率统计:遍历数组统计每个ISP的出现次数,并记录对应的设备ID列表,无需依赖数组排序。
- 找到最低频项:通过
min()获取最低频率,再筛选出所有符合该频率的ISP,最后返回对应设备ID。
内容的提问来源于stack exchange,提问作者rustin peter
相关产品推荐
相关产品推荐

