Versio

average()

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

BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  

PHP script bestanden

  1. average

 

34 reacties op 'average()'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Robert Deiman
Robert Deiman
5 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
5 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
5 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
5 jaar geleden
 
0 +1 -0 -1
In php kun je ook niet delen door 0 hoor, krijg je keurig een devide by zero error.
Luuk Schakenraad
Luuk Schakenraad
5 jaar geleden
 
0 +1 -0 -1
Nuttig..
PHP erik
PHP erik
5 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
5 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
5 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 Erkelens
Eddy Erkelens
5 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
5 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 Erkelens
Eddy Erkelens
5 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.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Citroen Anoniem Graag
Citroen Anoniem Graag
5 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 Erkelens
Eddy Erkelens
5 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
5 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
5 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 rrrr
Jelmer rrrr
5 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
5 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
5 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.
- -
- -
5 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 Erkelens
Eddy Erkelens
5 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
5 jaar geleden
 
0 +1 -0 -1
kijk eens naar trigger_error()
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Barman V
Barman V
5 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 rrrr
Jelmer rrrr
5 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 Erkelens
Eddy Erkelens
5 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
5 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
5 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
5 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 Erkelens
Eddy Erkelens
5 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
5 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
5 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 Erkelens
Eddy Erkelens
5 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
5 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 Erkelens
Eddy Erkelens
5 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.
Robert Deiman
Robert Deiman
5 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.

  • Labels
  • Geen tags toegevoegd.