我正在尝试输出此数组中出现频率最低的[device_ip_isp]
中的[device_id]
。此外,如果该数组只有两个可用的SharedDevice对象,并且具有不同的[device_ip_isp]
,则应输出第二个SharedDevice对象的[device_id]
array (
0 =>
SharedDevice::__set_state(array(
'device_no' => 1,
'device_id' => '82',
'device_ip_isp' => 'Verizon Fios',
)),
1 =>
SharedDevice::__set_state(array(
'device_no' => 2,
'device_id' => '201',
'device_ip_isp' => 'Spectrum',
)),
2 =>
SharedDevice::__set_state(array(
'device_no' => 3,
'device_id' => '312',
'device_ip_isp' => 'Verizon Fios',
)),
3 =>
SharedDevice::__set_state(array(
'device_no' => 4,
'device_id' => '9715',
'device_ip_isp' => 'Verizon Fios',
)),
4 =>
SharedDevice::__set_state(array(
'device_no' => 5,
'device_id' => '11190',
'device_ip_isp' => 'Verizon Fios',
)),
)
输出应为201
,因为“Spectrum
“出现的频率最低。
我尝试了以下操作,但遇到了问题:我不确定如何在比较之前对对象变量进行排序,以找到最不频繁的变量。
/*
$user->getUser_devices() will output the array shown above.
*/
leastFrequent($user->getUser_devices(), 5);
function leastFrequent($arr, $n){
// find the min frequency
// using linear traversal
$min_count = $n + 1;
$res = -1;
$curr_count = 1;
for ($i = 1; $i < $n; $i++) {
if ($arr[$i]['device_ip_isp'] == $arr[$i - 1]['device_ip_isp']) {
$curr_count++;
} else {
if ($curr_count < $min_count) {
$min_count = $curr_count;
$res = $arr[$i - 1]['device_id'];
}
$curr_count = 1;
}
}
// If last element is
// least frequent
if ($curr_count < $min_count) {
$min_count = $curr_count;
$res = $arr[$n - 1]['device_id'];
}
return $arr[$n]$res['device_id'];
}
1条答案
按热度按时间brgchamk1#
好的,下面是对这个片段的解释。
array_column
以获取单个数组中的所有device_ip_isp
值。array_count_values
以获得每个值的频率。array_reverse
以反转计数频率数组,因为您需要最新的共享设备ID,以防计数冲突,以获得最小计数值。min
以获得所有频率计数中的最低值。array_search
以获得第一频率min元素的密钥。device_ip_isp
匹配的密钥时立即返回设备IP。代码段:
Online Demo