在不使用php内置函数的情况下查找数组中出现次数最多的元素


Find most occurence element in array without using php Built-In function

如何在给定数组中找到出现次数最多的元素数组可以是偶数也可以是奇数我已经使用php内置函数找到了答案,但我想通过自定义函数来做到这一点。请帮忙。。。

    <?php
    $array = array(1,1,1,4,3,1,3);
    $count_special= array_count_values_special($array);//Counts the values in the array, returns associatve array
    $count= array_count_values($array); //PHP Built in functionCounts the values in the array, returns associatve array
    asort($count_special);
    asort($count);
    print_r($count_special);
    print_r($count);
    function array_count_values_special($array) {
        $ret_array = array();
        foreach($array as $value) {
            foreach($ret_array as $key2 => $value2) {
                if($key2 == $value) {
                    $ret_array[$key2]++;
                    continue 2;
                }
            }
            $ret_array[$value] = 1;
        }
        return $ret_array;
    }

享受:)

我实现了一个函数,该函数返回出现次数最多的值的数组:

var_dump(mostOccurringInArray(array(1,1,1,4,3,1,3,4,3,4,4))); 
// array(2) { [4]=> int(4) [1]=> int(4) }
var_dump(mostOccurringInArray(array(1,1,1,4,3,1,3,4,3))); 
// array(1) { [1]=> int(4) }
function mostOccurringInArray($array) {
    $occurrences = array();
    foreach($array as $v) 
        !array_key_exists($v, $occurrences) ? $occurrences[$v] = 1 : $occurrences[$v]++;    
    asort($occurrences); 
    $max = end($occurrences); 
    return array_filter($occurrences, function($value) use(&$max) { return $value == $max; });
}

如果您只想返回一个值:

function mostOccurringInArray($array) {
    $occurrences = array();
    foreach($array as $v) 
        !array_key_exists($v, $occurrences) ? $occurrences[$v] = 1 : $occurrences[$v]++;    
    asort($occurrences); 
    end($occurrences); 
    return key($occurrences);
}

我不确定你所说的"可以是偶数也可以是奇数"指的是什么,但像这样的函数是你想要的吗?

我不知道在PHP数组中查找对象的运行时,如果它像Java哈希图一样工作,那么每次查找都会花费O(1)。

这个+遍历数组的foreach循环将总共为O(n)。我不认为内置的PHP函数会比这更快,假设我对PHP关联数组在后台的工作方式是正确的。

public function mostOccuranceInArray($array)
    {
        // create associative array where key => object value => num of occurances
        $occurancesArray = array();
        $maxOccurances = - 1;
        $mostFrequentVal = NULL;
        foreach ($array as $val) {
            if (! $occurancesArray[$val]) { // if we have not added this value yet
                $occurancesArray[$val] = 0;
            } else {
                $occurancesArray[$val] ++; // increment the number of occurances
                if ($occurancesArray[$val] > $maxOccurances) {
                    $maxOccurances = $occurancesArray[$val];
                    $mostFrequentVal = $val;
                }
            }
        }
        return $val;
    }