Forum » Server-Side scripting » Bereken de modus
Rapifia Europe
Berichten: 3714
avatar
Offline Stuur privebericht
Beste,

Hoe kan ik de modus berekenen van een array?
Hij moet dus zegmaar de key met de hoogste frequentie weergeven, maar: als er 2 keys zijn dezelfde frequentie, dan moet ie weergeven dat er geen modus is.

Ik had dit script geprobeerd:
http://www.phphulp.nl/php/script/snippets/modus/1433/

Maar die weergeeft dus niet als er 2 dezelfde frequenties zijn dat er geen modus is, wat in de wiskunde wel hoort.

Ik hoop dat iemand me kan helpen!

Lars
P.S.
Ook met array_count_values(); ben ik bekend, maar ik snap niet hoe ik dat 2e wat ik wil dan doe.
Laatst gewijzigd door larsisgoed9 op 2010-11-03 19:33:13
03-11-2010 19:27
Dit topic is 610 keer bekeken door 55 verschillende leden
Reacties op: "Bereken de modus"
1 | 2 Volgende pagina
De causeur!
Berichten: 504
avatar
Offline Stuur privébericht
Ik heb het voor je gemaakt, met de array die ik heb gebruikt werkt het tenminste.

Misschien moet je zelf nog een keer testen met een andere array, heb zelf fe geen tijd om dat te doen. School examens....

Code:
Code | Selecteer Alles
minimaliseren
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
$getallen    
= array(1,1,2,2,2,3,4,5,5,5);
$volgorde    array_count_values($getallen);

$i 1;

$hoeveel = array();
$aantal     = array();

foreach(
$volgorde as $getal => $g)
{
    if(
$g >= 2)
    {
        
$hoeveel[$i] = $getal;
        
$aantal[$i]  = $g;
    }
    
$i++;
}


foreach(
$aantal as $k => $v)
{
    if(
max($aantal) == $v)
    {
        echo 
$hoeveel[$k];
    }
}
?>


Graag gedaan!

Mees Molenaar
03-11-2010 20:09
Rapifia Europe
Berichten: 3714
avatar
Offline Stuur privébericht
Heey,

Het werkt bijna.
Als ik deze reeks heb:
Code | Selecteer Alles
minimaliseren
1
2
3
4
5
6
1,0
2
,0
3
,0
4
,0
4
,0
5
,0

Dan werkt ie, zegt ie dat de modus 4 is.

Maar als ik deze reeks heb:
Code | Selecteer Alles
minimaliseren
1
2
3
4
5
1,0
2
,0
3
,0
4
,0
4
,0

Dan werkt ie niet, en geeft ie dus niet weer..

Lars
03-11-2010 20:53
De causeur!
Berichten: 504
avatar
Offline Stuur privébericht
Als ik dit geef:
Code | Selecteer Alles
minimaliseren
1
$getallen    = array(1,2,3,4,4);


Dan werkt het gewoon hoor.
Anders denk ik dat het door de komma getallen komt, want een komma wordt gelezen als de volgende waarde in een array.

En met een punt kan niet, want die functie is alleen voor strings en integers...
03-11-2010 20:58
Rapifia Europe
Berichten: 3714
avatar
Offline Stuur privébericht
Hmm..
Als ik de array print_r(); dan krijg ik dit eruit:
Code | Selecteer Alles
minimaliseren
1
Array ( [0] => 1.0 [1] => 2.0 [2] => 4.0 [3] => 6.0 [4] => 6.0 )

En dan zegt ie "Geen modus".
Heb het script een beetje bewerkt:
Code | Selecteer Alles
minimaliseren
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function modus($input$afrond){
$getallen    str_replace(",""."$input);
echo 
print_r($getallen);
$volgorde    array_count_values($getallen);

$i 1;

$hoeveel = array();
$aantal     = array();

foreach(
$volgorde as $getal => $g)
{
    if(
$g >= 2)
    {
        
$hoeveel[$i] = $getal;
        
$aantal[$i]  = $g;
    }
    
$i++;
}


foreach(
$aantal as $k => $v)
{
    if(
max($aantal) == $v)
    {
        
$modus $hoeveel[$k];
        echo 
number_format($hoeveel[$k], $afrond',''.');
        echo 
'<small><i><b>Berekening:</b> Kijk welk getal het meest voorkomt / de hoogste frequentie heeft.In dit geval is dat '.number_format($hoeveel[$k], $afrond',''.').'</i>.</small>';
    }
}
if(
$modus == ""){
echo 
'Geen modus';
}
}

Ik wou het in een functie, omdat ik het meerdere malen aanroep.

Bedankt alvast,

Lars

Nieuwe reactie samengevoegd met originele reactie op 03.11.10 21:18:08:
Ook als ik de reeks 1-2-3-4-4 gebruik krijg ik de foutmelding...
03-11-2010 21:12
De causeur!
Berichten: 504
avatar
Offline Stuur privébericht
Heb jij deze error dan niet?
Code | Selecteer Alles
minimaliseren
1
array_count_values() [function.array-count-values]: Can only count STRING and INTEGER values!
03-11-2010 21:20
Rapifia Europe
Berichten: 3714
avatar
Offline Stuur privébericht
Nee, krijg ik niet
Maar ik heb het ook geprobeerd zonder comma's, en dat werkt dus ook niet..

Lars
03-11-2010 21:21
De causeur!
Berichten: 504
avatar
Offline Stuur privébericht
Code | Selecteer Alles
minimaliseren
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$getallen    = array(1,2,2,3,4);

$volgorde    array_count_values($getallen);

$i 1;

$hoeveel = array();
$aantal     = array();

foreach(
$volgorde as $getal => $g)
{
    if(
$g >= 2)
    {
        
$hoeveel[$i] = $getal;
        
$aantal[$i]  = $g;
    }
    
$i++;
}


foreach(
$aantal as $k => $v)
{
    if(
max($aantal) == $v)
    {
        
$modus $hoeveel[$k];
        echo 
number_format($hoeveel[$k], $afrond',''.');
        echo 
'<small><i><b>Berekening:</b> Kijk welk getal het meest voorkomt / de hoogste frequentie heeft.In dit geval is dat '.number_format($hoeveel[$k], $afrond',''.').'</i>.</small>';
    }
}
if(
$modus == ""){
echo 
'Geen modus';
}


Dan komt gewoon netjes:
Code | Selecteer Alles
minimaliseren
1
2BerekeningKijk welk getal het meest voorkomt de hoogste frequentie heeft.In dit geval is dat 2.
03-11-2010 21:22
Gevallen leider
Berichten: 118
avatar
Offline Stuur privébericht
Die code die je nu gebruikt is eigenlijk best wel super slordig...

Probeer dit eens
Code | Selecteer Alles
minimaliseren
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
function getHighestArrayKeyFrequence($arr)
{
    
$frequence array_count_values($arr);
    
natsort($frequence);

    
$duplicated array_count_values($frequence);
    
natsort($duplicated);

    return 
$duplicated[max($frequence)] > null current(array_keys(array_reverse($frequence)));
}

$names = array(
    
'Jack' => 'Johnson',
    
'Mary' => 'Flint',
    
'Sarah' => 'Stones',
    
'Harry' => 'Potter',
    
'James' => 'Johnson',
    
'Hermione' => 'Granger',
    
'Ron' => 'Weasley',
    
'Draco' => 'Malfoy',);

$mostFrequentName getHighestArrayKeyFrequence($names);
if(
$mostFrequentName != null)
    echo 
'The most frequent used name is ' $mostFrequentName;
else
    echo 
'I\'m sorry, I\'ve tried every workaround, even tried to convince people to change their surname, but unfortunately there is no surname that is actually used the most.';
03-11-2010 21:31
De causeur!
Berichten: 504
avatar
Offline Stuur privébericht
Ja klopt, ben niet niet een erg gevorderd scripter
En had dit even snel gemaakt!

PS: Ziet er erg goed uit . Alleen ik hou meer van gewoon Nederlands.
03-11-2010 21:39
Rapifia Europe
Berichten: 3714
avatar
Offline Stuur privébericht
@Rahl,
Het werkt nog niet, nog steeds hetzelfde probleem..
Array is gewoon 1-2-3-4-4 en dan geeft ie dus dat fout bericht weer...

Lars

Nieuwe reactie samengevoegd met originele reactie op 03.11.10 21:49:44:
Ik heb het script even losgekoppeld van de site.
Dan krijg ik hetzelfde:
http://planemania.nl/overig/array.php

In dit script:
Code | Selecteer Alles
minimaliseren
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
function modus($arr){
    
$frequence array_count_values($arr);
    
natsort($frequence);

    
$duplicated array_count_values($frequence);
    
natsort($duplicated);
    
    return 
$duplicated[max($frequence)] > null current(array_keys(array_reverse($frequence)));
}

echo 
'<font face="arial">De modus is: <b>';
$modus modus(array(1,2,3,4,4));
if(
$modus != null) {
echo 
$modus;
} else{
echo 
'Geen modus';
}
echo 
'</b></font>';
?>


Wat is het

Lars
03-11-2010 21:46
Reageer op: "Bereken de modus"
1 | 2 Volgende pagina
Je kan niet reageren omdat je niet bent ingelogd. Inloggen of Aanmelden