douzhong4222 2019-05-10 06:25
浏览 225
已采纳

php从多维数组中获取最多和最少的值

I want to get most and least occuring values from php sequential/indexes, assoc and multidimensional arrays

Consider the following dataSet

        $dataSet = [
            'users' => 
            [
                'id' => 1,
                'name' => "Alex",
                'username' => 'alex',
            ],
            [
                'id' => 2,
                'name' => "Alex",
                'username' => 'alex'
            ],
            [
                'id' => 2,
                'name' => "Peter Khot",
                'username' => 'peter',
            ]
        ];

Here above are samples dataSet

Here is what that i tried

    function most_occurring(array $array, $key)
    {
        $dataSet = [];
        $i = 0;
        $keys = [];
        foreach ($array as $k) {
            if (in_array($k[$key], $keys)) {
                $keys[$i] = $k[$key];
                $dataSet[$i] = $k;
            } 

            $i++;
        }

        return $dataSet;
    }

I tried above code for most occurring values but not working at all, help me in most and least occuring values from arrays. Thanks

  • 写回答

2条回答 默认 最新

  • drll42469 2019-05-10 07:15
    关注

    Thanks to KIKO Software, you can still use array_count_values() for this cases. You will also need to use array_columns() and array_search() in this situation. You can refer to this link to see how array_search() helps in finding the maximum/minimum value and its corresponding key inside an array. To find the most or least occurrence, simply echo the last 6 variables that I have declared in the last 6 lines.

    EDIT* reference: unset array_push

    *And also, your first data in the assoc array is indexed 'user', but the second data in the assoc array is not indexed and hence it is indexed as 0.

    $dataSet = [
                'users' => 
                [
                    'id' => 1,
                    'name' => "Alex",
                    'username' => 'alex',
                ],
                [
                    'id' => 2,
                    'name' => "Alex",
                    'username' => 'alex'
                ],
                [
                    'id' => 2,
                    'name' => "Peter Khot",
                    'username' => 'peter',
                ]
            ];
    $id = array_column($dataSet,'id');
    $name = array_column($dataSet, 'name');
    $username = array_column($dataSet, 'username');
    $occur_id = array_count_values($id);
    $occur_name = array_count_values($name);
    $occur_username = array_count_values($username);
    $most_occur_id  = array_search(max($occur_id),$occur_id);
    $most_occur_name  = array_search(max($occur_name),$occur_name);
    $most_occur_username  = array_search(max($occur_username),$occur_username);
    $least_occur_id  = array_search(min($occur_id),$occur_id);
    $least_occur_name  = array_search(min($occur_name),$occur_name);
    $least_occur_username  = array_search(min($occur_username),$occur_username);
    

    EDIT*: (In case of multiple highest occurence OR all same occurence, just add below code right below the above code.)

    $flag = true;
    $most_occur_name_list = [];
    $count = 0;
    while($flag)
    {
      $most_occur_name_ct =  max($occur_name);
      if($most_occur_name_ct == $count || $count == 0)
        {
          array_push($most_occur_name_list,array_search($most_occur_name_ct,$occur_name));
          unset($occur_name[array_search($most_occur_name_ct,$occur_name)]);
          $count = $most_occur_name_ct;
          if(count($occur_name) == 0)
          {
              $flag = false;
              break;
          }
        }
      else
        {
          $most_occur_name_ct = $count;
          $flag = false;
          break;
        }
    }
    
    //must reinitialize the array
    $occur_name = array_count_values($name);
    $flag = true;
    $least_occur_name_list = [];
    $count = 0;
    while($flag)
    {
      $least_occur_name_ct =  min($occur_name);
      if($least_occur_name_ct == $count || $count == 0)
        {
          array_push($least_occur_name_list,array_search($least_occur_name_ct,$occur_name));
          unset($occur_name[array_search($least_occur_name_ct,$occur_name)]);
          $count = $least_occur_name_ct;
          if(count($occur_name) == 0)
          {
              $flag = false;
              break;
          }
        }
      else
        {
          $least_occur_name_ct = $count;
          $flag = false;
          break;
        }
    }
    if($most_occur_name_ct == $least_occur_name_ct)
    {
        $most_occur_name_list = [];
        $least_occur_name_list = [];
    }
    echo "<pre>";
    print_r($most_occur_name_list);
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?
  • ¥15 乘性高斯噪声在深度学习网络中的应用