php 从对象数组中获取最不频繁的项

pprl5pva  于 2022-12-21  发布在  PHP
关注(0)|答案(1)|浏览(117)

我正在尝试输出此数组中出现频率最低的[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'];
}
brgchamk

brgchamk1#

好的,下面是对这个片段的解释。

  • array_column以获取单个数组中的所有device_ip_isp值。
  • array_count_values以获得每个值的频率。
  • array_reverse以反转计数频率数组,因为您需要最新的共享设备ID,以防计数冲突,以获得最小计数值。
  • min以获得所有频率计数中的最低值。
  • array_search以获得第一频率min元素的密钥。
  • 最后,我们反转输入数组,以便在我们从上述步骤中找到与当前device_ip_isp匹配的密钥时立即返回设备IP。
    代码段:
<?php

function getLeastFrequentElement($arr){
  $freqs = array_reverse(array_count_values(array_column($arr, 'device_ip_isp')));
  $deviceIPISP = array_search(min($freqs), $freqs);
  foreach(array_reverse($arr) as $sharedDevice){
    if($sharedDevice->device_ip_isp === $deviceIPISP){
      return $sharedDevice->device_id;
    }
  }

  throw new Exception("No shared object found!");
}

echo getLeastFrequentElement($arr);

Online Demo

相关问题