Archief - INFO: PHP/meest voorkomende getallen in een array

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

netlash

Legacy Member
Ik heb een ééndimensionale array, met allemaal cijfers in.

vb. array(1,12,65,9465,364,1,665,894,12,154,1,698,9,9)

Hoe haal ik er op de snelst mogelijke manier de drie meest voorkomende getallen uit ?

In bovenstaand voorbeeld wil ik graag als resultaat de cijfers 1, 9 en 12.

Probleem : de array in kwestie kan zeer groot zijn (172800 getallen of meer); array_count_values geeft me volgende foutmelding : Allowed memory size of 8388608 bytes exhausted .

DarkBone

Legacy Member
Mag ik vragen hoe je aan die getallen komt?
Komen die uit een database? Zoja, dan laat je dat werk beter ook door die database doen.

netlash

Legacy Member
Nee, de getallen worden on the fly gegenereerd.

Ik zou ze tijdelijk in een database kunnen steken, maar... 172800 velden wegschrijven naar een database enkel om een berekening te doen lijkt me nogal ... tja ... hoe zou ik het zeggen ... onelegant ?

DarkBone

Legacy Member
Dan zou je inderdaad die ingebouwde functie kunnen gebruiken, maar blijkbaar is er te weinig geheugen voor gereserveerd.

Ge zou het zelf kunnen bijhouden hé. Uw array handmatig overlopen en een count bijhouden in een nieuwe array.

Mag ik anders es de code zien, of is dat niet mogelijk? 'k Zou anders es zelf proberen ook :)

icerulez

Legacy Member
misschien es zo proberen, ma kdenk dat dees ook veel geheugen zal slorpen:

PHP:
$aantal = array();

foreach($array AS $i)
{
(!isset($aantal[$i]))? $aantal[$i] = 1 : $aantal[$i]++;
}

arsort($aantal);
$e = 0;
while(list($key, $w) = each($aantal))
{
	if($e < 3)
	{
		$getal[$e] = $key;
		$e++;
	}
	else
	{
		break;
	}
}

//getal bevat u 3 cijfers

killgore

Legacy Member
is idd niet zo moeilijk, en ik ga akkoord met het grootste deel van icerulez zen code :), maar ik snap niet wat ie vanaf die $e doet :s
PHP:
function maximum($numbers, $count = 3)
{
	$getallen = array_count_values($numbers);
	arsort($getallen);
	$count = (sizeof($getallen)<$count)?sizeof($getallen):$count;
	$getallen = array_chunk($getallen,$count, true);
	return array_keys($getallen[0]);
}
zo zou ik et doen :).

Goede functie imho :p
//Edit: functie NOG beter gemaakt :p

netlash

Legacy Member
Killgore,

Het is de functie array_count_values() die fouten geeft. Die kan je dus niet gebruiken.

killgore

Legacy Member
netlash zei:
Killgore,

Het is de functie array_count_values() die fouten geeft. Die kan je dus niet gebruiken.
khad andere versie ook, sec.:
PHP:
function maximum($numbers, $count = 3)
{
    $getallen= array();

    foreach($numbers AS $i)
    {
        (!isset($getallen[$i]))? $getallen[$i] = 1 : $getallen[$i]++;
    }
    arsort($getallen);
    $count = (sizeof($getallen)<$count)?sizeof($getallen):$count;
    $getallen = array_chunk($getallen,$count, true);
    return array_keys($getallen[0]);
}
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan