douzhong4222
2019-05-10 06:25 阅读 127
已采纳

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 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);
    
    点赞 评论 复制链接分享
  • dtysql0586 dtysql0586 2019-05-10 08:35

    If you wanted to get a list of the min and max number of occurrences for just 1 element of the multidimensional array, then this code may offer a shorter method - comments in code...

    $dataSet = [
        'users' =>
        [
            'id' => 1,
            'name' => "Alex",
            'username' => 'alex',
        ],
        [
            'id' => 2,
            'name' => "Alex",
            'username' => 'alex'
        ],
        [
            'id' => 2,
            'name' => "Peter Khot",
            'username' => 'peter',
        ],
        [
            'id' => 2,
            'name' => "Peter Khot",
            'username' => 'peter',
        ],
        [
            'id' => 2,
            'name' => "Paul Khot",
            'username' => 'Paul',
        ]
    ];
    
    // Create an array which has the username column, but retaining the keys from
    // the original array
    $set = array_combine(array_keys($dataSet), 
            array_column($dataSet, "username" ));
    // Summarise the values
    $count = array_count_values($set);
    
    // Get a list of the keys which match the max and min values
    $minRecords = array_keys($count,min($count));
    $maxRecords = array_keys($count,max($count));
    // Fetch the details for the maximum value (first one returned)
    $maxElements = [];
    foreach ( $maxRecords as $max ) {
        $maxElements[] = $dataSet[array_search($max, $set )];
    }
    
    // Same for min values
    $minElements = [];
    foreach ( $minRecords as $min ) {
        $minElements[] = $dataSet[array_search($min, $set )];
    }
    
    print_r($maxElements);
    print_r($minElements);
    

    With the test data I've added, you get the output...

    Array
    (
        [0] => Array
            (
                [id] => 1
                [name] => Alex
                [username] => alex
            )
    
        [1] => Array
            (
                [id] => 2
                [name] => Peter Khot
                [username] => peter
            )
    
    )
    Array
    (
        [0] => Array
            (
                [id] => 2
                [name] => Paul Khot
                [username] => Paul
            )
    
    )
    
    点赞 评论 复制链接分享

相关推荐