2010-05-05 5 views

Répondre

6
$a = array(1, 2, 3, 4, 3, 3, 4, 4, 1, 3); 
$r = array_count_values($a); 
$k = array_search(max($r), $r); 
echo "most frequent value is $k"; 
+0

+1, puisque cela est probablement plus rapide que la solution d'origine que j'ai proposée, étant donné que la recherche du maximum prend un temps linéaire, par opposition à un tri qui prend le temps «n log n». – Amber

+0

ouais c'est génial – nik

+0

@stereo: Ne devrions-nous pas utiliser array_keys au lieu de array_search? – Bruce

0

Essayez max

$max = max($array_ids); 
+0

Je ne pense pas que cela répond à la question de l'OP - ils semblent avoir affaire à * fréquences *, et donc je suppose qu'ils voulez l'élément qui se produit le plus souvent dans le tableau. – Amber

+0

@Dav: vous avez raison – Bruce

7
// Gives us an associative array of id=>count mappings, 
$counts = array_count_values($array_ids); 
// and sorts it from largest to smallest count 
arsort($counts); 

// Gets the first key after sorting, which is the id with the largest count 
$max_freq_id = key($counts); 

La suggestion d'utiliser array_search() combinée à max() peut être plus rapide que cela, cependant, car il n'a pas besoin de tableau complètement trier et donc fonctionnera en O(n) fois au lieu de O(n log n).

+0

Droit, oublié que les sortes de PHP le font sur place. Fixé. – Amber

2

Abordant la question de plusieurs éléments avec la même fréquence:

$values = array(1, 1, 3, 3, 3, 3, 4, 5, 5, 5, 5, 6); 
$freq = array_count_values($values); 
arsort($freq); 
$max = $val = key($freq); 
while(next($freq) && current($freq) == $freq[$max]){ 
    $val .= ','.key($freq); 
} 

echo " most frequent value is/are $val "; 

ce sera ouput

valeur la plus fréquente est/sont 5,3

aussi, c'est un peu plus rapide que d'utiliser array_search et max combo ...

Questions connexes