average()

Door Eddy E, 20 jaar geleden, 14.009x bekeken

Naast max(), min(), array_sum() is er geen average() (oftewel array_average()) om het gemiddelde te berekenen.

Met deze functie heb je die wel.
Het kan korter, maar er moet natuurlijk wel een controle zijn. Die is hierbij ingebouwd.

Voorbeeld: http://www.zunflappie.nl/temp/average.php

Gesponsorde koppelingen

PHP script bestanden

  1. average

 

Er zijn 34 reacties op 'Average'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Robert Deiman
Robert Deiman
20 jaar geleden
 
0 +1 -0 -1
Dit vind ik nu een leuke / handige snippet. Is mooi eenvoudig zo om het gemiddelde te bepalen. Zo staat die ook ongeveer op PHP.net, maar dan worden de waarden eerst nog in variabelen gezet.
Marcel
Marcel
20 jaar geleden
 
0 +1 -0 -1
Het kan ook zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
    // function average() == gemiddelde
    function average ( Array $array )
    {

        // bereken gemiddelde (som / aantal)
        return array_sum($array) / count($array);
    }

?>
Dan krijg je een melding van PHP als je iets anders dan een array in de functie als argument mee wilt geven. return false; vind ik toch een beetje vaag. Je moet dan eigenlijk altijd controleren of de functie false oplevert of niet.

Verder leuke snippet inderdaad :-P Lekker nuttig, en dat is alles wat een code hier hoeft te zijn.
Emmanuel Delay
Emmanuel Delay
20 jaar geleden
 
0 +1 -0 -1
Nee, het is geen slecht idee een false weer te geven wanneer je geen array hebt.

Delen door 0 mag niet, als count een 0 geeft, krijg je wiskundige nonsens.

Php gaat er ook van uit dat niet-numerieke variabelen toch de waarde 0 krijgen; in javascript krijg je een NAN (Not A Number) fout. Eventueel zou het ook nuttig kunnen zijn daarop te controleren.
PHP Newbie
PHP Newbie
20 jaar geleden
 
0 +1 -0 -1
In php kun je ook niet delen door 0 hoor, krijg je keurig een devide by zero error.
Onbekend Onbekend
Onbekend Onbekend
20 jaar geleden
 
0 +1 -0 -1
Nuttig..
PHP erik
PHP erik
20 jaar geleden
 
0 +1 -0 -1
Ik ben het met Marcel eens. Je kunt beter "Array $array" doen en een error verwachten als je geen array geeft. Anders ben je weer heel 'loose' bezig zonder verder doel.

PHP zelf gooit ook errors als je een verkeerde argument meegeeft, dus het is veruit het meest logisch om dit zelf ook te gebruiken.
Barman V
Barman V
20 jaar geleden
 
0 +1 -0 -1
Naast de check of $array een array is, moet je ook controleren of het om een gevulde array gaat. Array ( ) is in de count() nog steeds 0 zero nada noppes. Hierdoor krijg je alsnog de devide by zero melding.

Volgens mij ben je dan nog genoodzaakt tot het volgende
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
return ($hits = count($array)) ? array_sum($array) / $hits; : false;
?>
PHP erik
PHP erik
20 jaar geleden
 
0 +1 -0 -1
Zucht :)

Je doet toch ook geen foreach ((empty($array) ? die() : $array) as $key => $value) of zoiets absurds. Controleren doe je vóórdat je überhaupt je array in je average() functie gooit. False returnen is sowieso raar als je een getal verwacht.
Eddy E
Eddy E
20 jaar geleden
 
0 +1 -0 -1
De controle of de getallen niet leeg (of 0) zijn ingevoerd.
Maar wat moet ik returnen als er fouten zijn? Een false is niet logisch, maar wat dan?
Gewoon een 0?

Het script is reeds gewijzigd en controleerd dus of de array een array is, of deze niet leeg is en de getallen bij elkaar geen 0 zijn (dus geen inhoud).
Citroen Anoniem Graag
Citroen Anoniem Graag
20 jaar geleden
 
0 +1 -0 -1
Waarom mag de array_sum geen 0 zijn? als ik het gemiddeld van 2 en -2 wil weten, dan komt daar toch gewoon 0 uit??
Edit:
Zie dat je een nul retourneerd ipv een false, dan maakt het nix uit]/edit]

Waarom nooit een false retourneren? Dan weet je toch nooit zeker of het gelukt is?

Daarnaast is is_array overbodig geworden

Ik zou het zo doen

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

function array_avg(array $aArray)
{

    if(count($aArray) == 0)
    {

        return false;
    }

    
    return array_sum($aArray) / count($aArray);
}
[
/code]

Die code doet vaag.
Eddy E
Eddy E
20 jaar geleden
 
0 +1 -0 -1
# Citroen: als de som van de array 0 is, dan returnd ie toch ook een 0?
Ipv dus een false krijg je een 0, dus dat maakt geen verschil.
De functie zal nu altijd een getal retourneren, desnoods een 0.
is_array kan inderdaad weg en zal ik zo even uit het script verwijderen, want het is immers nu altijd een array.

Over de naam van de functie: bij min() en max() moet je ook een array opgeven en php-zelf gebruikt daarbij ook het woord array niet.
Logisch, want van een int of string kan je geen gemiddelde berekenen. Het moet dus altijd een array zijn.
Vandaar die naamkeuze.

Wat ik wel zie bij min() en max() is dat je onbeperkte arrays op kan geven.
Hoe doen ze dat? Dus het uitlezen hoeveel arrays er zijn opgegeven?
Want dat is wel een leuke toevoeging.
Citroen Anoniem Graag
Citroen Anoniem Graag
20 jaar geleden
 
0 +1 -0 -1
Jij krijgt nu nooit een false terug terwijl dat wel moet gebeuren. Bijvoorbeeld wanneer de array leeg is. Het is een beetje stom om dan maar gewoon een 0 terug te geven, want 0 != gemiddelde van niets.

Naamkeuze, zou idd ook avg kunnen zijn, hangt er net vanaf wat je prefereerd. ik vind met array ervoor makkelijker omdat je ook nog een functie zou kunnen maken die van ints een gemiddelde uitrekend:
vb: function avg($getal1, $getal2)
De array geeft dus aan dat het om een gemiddelde van een array gaat.

Onbeperkte arrays? Simpel:
http://nl2.php.net/manual/en/function.func-get-args.php, daarmee kan je kijken wat er aan parameters is opgegeven. Nu moet je wel controleren of alles arrays zijn.

Succes
Eddy E
Eddy E
20 jaar geleden
 
0 +1 -0 -1
# Citroen: bedankt voor func_get_args(). Daar kan ik weer veel verder mee. Alleen nu nog array_merge() laten doen wat het moet doen, namelijk alles combineren tot 1 array (array_combine() doet niet wat ik wil).

De naam zal niet gewijzigd worden, want ik maak wel dat als een opgegeven $var geen array is, maar wel int, dat die dan ook wordt meegeteld als cijfer.
Dus dat dit het wordt:

average($array, $int, $int, $array, $int)

Dat dan alle getallen meetellen.

Edit:


Het script is dusdanig gewijzigd dat je ongelimiteerd INTs en ARRAYs kan opgeven.
Zie voorbeeld en code.
Het werkt goed, maar het is nogal omslachtig.
Helaas werkt array_merge() niet zoals ik wil (hij plaatst ze in een subarray).
Citroen Anoniem Graag
Citroen Anoniem Graag
20 jaar geleden
 
0 +1 -0 -1
Een stuk beter, nu kan je hem overal voor gebruiken.
Ik zou ipv fout echter een false retourneren. Dat is veel gebruikelijker. Of een exception gooien.

Als je een fout retourneerd dan moet je zo kijken of het gemiddelde berekenen gelukt is:
if(average(allemaal dingen) !== false)
{
echo het gemiddelde is average(allemaal dingen);
}
Op die manier ontstaat er geen verwaring over een gemiddelde van 0 (bij 4 en -4) en bij een false.
Terence Hersbach
Terence Hersbach
20 jaar geleden
 
0 +1 -0 -1
niet een 0 retourneren, want het gemiddelde van -2 en 2 is 0 > verwarring
niet false retoureneren, want je stuurt tenslotte toch echt een array > verwarring

wat er uit komt is altijd onbekend, je zult dus 'null' moeten retourneren, wat dan ook staat voor onbekend.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
return null;
?>
Jelmer -
Jelmer -
20 jaar geleden
 
0 +1 -0 -1
Ik denk dat het consistenter is om toch false terug te geven in plaats van een string of null, aangezien max dit ook doet, en vele andere PHP functies. Eventueel nog een trigger_error erbij om aan te geven wat de fout is. Mensen kunnen dan zelf wel de error onderdrukken met een apenstaartje wanneer ze voorbereid zijn op false als antwoord.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
var_dump(max(array()));
?>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
bool(false)
PHP Warning: max(): Array must contain at least one element in /- on line 3


PS: naar mijn mening staat NULL niet voor onbekend, maar voor leeg. Een onbekende waarde is een waarde die je niet weet. Leeg is een toestand die je wel weet. FALSE daarentegen wordt binnen PHP constant gebruikt om een fout aan te geven (stripos, min, max, preg_match etc.) wanneer true/false niet een van de mogelijke normale antwoorden zijn.
Citroen Anoniem Graag
Citroen Anoniem Graag
20 jaar geleden
 
0 +1 -0 -1
niet false retoureneren, want je stuurt tenslotte toch echt een array > verwarring

Waarom zou een array functie geen false kunnen opleveren? Ik snap die verwaring niet.

Zoals Jelmer al zei is null eigelijk nix. En om nou nix te retourneren alleen omdat er een foutje zit is ook weer zo cru

Maar een exception of een trigger_error is denk ik ook wel mooi
Terence Hersbach
Terence Hersbach
20 jaar geleden
 
0 +1 -0 -1
Wikipedia:
Null is in de informatica een term die vaak gebruikt wordt om een ontbrekende (of onbekende) waarde aan te duiden.
- -
- -
20 jaar geleden
 
0 +1 -0 -1
Wil net zeggen, NULL kun je goed gebruiken als je de variabele later pass wilt overrulen, maar hij moet wel bestaan..

Edit:
Verder een mooie snippet
Eddy E
Eddy E
20 jaar geleden
 
0 +1 -0 -1
Maar zijn er nog andere verbeterpunten betreffende deze functie?

Eventuele uitbreidingen die ik zelf bedacht: hoe laat ik een "notice" geven indien er fouten zijn?
Moet dat via die class exception{} en zo ja: hoe doe ik dat (nooit eerder gedaan)?
Citroen Anoniem Graag
Citroen Anoniem Graag
20 jaar geleden
 
0 +1 -0 -1
kijk eens naar trigger_error()
Barman V
Barman V
20 jaar geleden
 
0 +1 -0 -1
@Eddy en Citroen:
Je kunt natuurlijk ook gewoon een -1 retourneren.

@PHPErik:
Over de false waarde heb je naar mijn weten gelijk, dit zou natuurlijk -1 moeten zijn.

Een foreach met een lege array werkt gewoon (zonder fouten). Maar delen door 0 (een count() in een lege array()) werkt niet en retourneert een fout. Vandaar mijn opmerking hierover.

Een array_sum($array) / 0 geeft gewoon een fout.
Dus:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$legeArray
= array();

// dit gaat goed
foreach ($legeArray as $key => $value){
}


// dit gaat fout
$getal = array_sum($legeArray) / count($legeArray);

// dit gaat goed
$getal = ($hits = count($legeArray)) ? array_sum($legeArray) / $hits; : -1;
?>
Jelmer -
Jelmer -
20 jaar geleden
 
0 +1 -0 -1
Als je -1 als fout-waarde zou gebruiken, wat is dan nog het verschil tussen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
var_dump(average(array()));
?>

en
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
var_dump(average(array(-2, -2, 1)));
?>
Eddy E
Eddy E
20 jaar geleden
 
0 +1 -0 -1
@ Barman:
Een -1 retourneren kan inderdaad niet om de reden die Jelmer hierboven geeft. Vooralsnog lijkt mij een 'false' alsnog het beste.

Tevens zal een lege array ($getallen) niet leeg kunnen zijn, want dan krijg je dus die false.
De controle staat er net iets boven de return.
en count($getallen) zal nooit false teruggeven, omdat de functie zelf voorziet in die array $getallen.
Hij kan wel 0 teruggeven (count dus!), en dan returnd mijn functie een false.
Barman V
Barman V
20 jaar geleden
 
0 +1 -0 -1
Ah natuurlijk, dat ik daar niet aan gedacht had. Laten we het op false houden :)

De count controle staat in jullie voorbeeld net iets boven de return, ziet er dus goed uit. Ik doelde meer op het voorbeeld dat Marcel gaf (2e post).

Mijn voorbeeldje is ietsjes efficiënter, aangezien je dan maar 1 maal de count() hoeft uit te voeren. Maar dit is iets pietepeuterigs :D
Terence Hersbach
Terence Hersbach
20 jaar geleden
 
0 +1 -0 -1
false word leuk als je dit doet:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
if(avarage(array()) == 0)
{

}


if(avarage(array(-1,1)) == 0)
{

}

?>
Citroen Anoniem Graag
Citroen Anoniem Graag
20 jaar geleden
 
0 +1 -0 -1
dan gebruik je tog gewoon dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
if(avarage(array()) === false)
{

    echo 'kut, een fout';
}


if(avarage(array(-1,1)) == 0)
{

    echo 'het is 0 gemiddeld';
}

?>
Eddy E
Eddy E
20 jaar geleden
 
0 +1 -0 -1
Precies, oftewel:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php if(average(array()) !== false)
  {

  echo average(array());
  }

?>


Veel korter kan het dus helaas weer eens niet.
Nadeel vind persoonlijk van deze methode dat je de functie 2x moet uitvoeren. Kan dat niet makkelijker/sneller?
Robert Deiman
Robert Deiman
20 jaar geleden
 
0 +1 -0 -1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if($var = average(array()) !== false){
  echo $var;
  }

?>
Terence Hersbach
Terence Hersbach
20 jaar geleden
 
0 +1 -0 -1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo average(array()) !== false ? average(array()) : 'blub';
?>


zo kan je het ook nog eventueel schrijven, krijg je wel weer 2 x de functie..
Eddy E
Eddy E
20 jaar geleden
 
0 +1 -0 -1
De manier van Robert ken ik helemaal niet, maar werkt blijkbaar wel goed.
Bedankt, dit ga ik vaker gebruiken, ook bij error_reporting etc.
Robert Deiman
Robert Deiman
20 jaar geleden
 
0 +1 -0 -1
Ik vind deze snippet wel een goed plan, op zich is een array prima te analyseren. In statistiek e.d. heb je nog veel meer functies, deze zouden het ook prima doen, waaronder:
= Modus
= Mediaan
= Standaardafwijking
Eddy E
Eddy E
20 jaar geleden
 
0 +1 -0 -1
U vraagt, wij draaien: http://www.phphulp.nl/php/scripts/11/1433 voor de modulus (niet per se voor getallen).

En http://www.phphulp.nl/php/scripts/1/1434 voor de mediaan. Deze laatste was niet zo moeilijk.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Robert Deiman
Robert Deiman
20 jaar geleden
 
0 +1 -0 -1
Lol Eddy,

Het was ook niet bedoeld als vraag of jullie dat voor me konden maken ;) Maar ik zal ze bekijken.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. average

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.