Example:
$a[] = \'56\';
$a[] = \'66\';
$a[] = \'\';
$a[] = \'58\';
$a[] = \'85\';
$a[] = \'\';
$a[] = \'\';
$a[] = \'76\';
$a[] = \'\';
$a[] = \'57\';
first you need to remove empty values, otherwise average will be not accurate.
so
$a = array_filter($a);
$average = array_sum($a)/count($a);
echo $average;
DEMO
More concise and recommended way
$a = array_filter($a);
if(count($a)) {
echo $average = array_sum($a)/count($a);
}
See here
The accepted answer works for the example values, but in general simply using array_filter($a)
is probably not a good idea, because it will filter out any actual zero values as well as zero length strings.
Even '0'
evaluates to false, so you should use a filter that explicitly excludes zero length strings.
$a = array_filter($a, function($x) { return $x !== ''; });
$average = array_sum($a) / count($a);
echo array_sum($a) / count(array_filter($a));
As a late look, item controls should be done with numeric check. Otherwise something like this $array = [1.2, 0.33, [123]]
will corrupt the calculation:
// Get numerics only.
$array = array_filter($array, fn($v) => is_numeric($v));
// Get numerics only where value > 0.
$array = array_filter($array, fn($v) => is_numeric($v) && ($v > 0));
Finally:
public static function average(array $array, bool $includeEmpties = true): float
{
$array = array_filter($array, fn($v) => (
$includeEmpties ? is_numeric($v) : is_numeric($v) && ($v > 0)
));
return array_sum($array) / count($array);
}
Credits: froq.util.Arrays