如何在php中从数组中找到平均值?

82

示例:

$a[] = '56';
$a[] = '66';
$a[] = '';
$a[] = '58';
$a[] = '85';
$a[] = '';
$a[] = '';
$a[] = '76';
$a[] = '';
$a[] = '57';

实际上如何从这个数组中找到不包括空值的平均值。请帮忙解决这个问题。


4
不应将整数定义为字符串。应该使用 $a[] = 56; 代替 $a[] = '56'; - Avatar
4个回答

164

首先,您需要删除空值,否则平均值将不准确。

所以

$a = array_filter($a);
$average = array_sum($a)/count($a);
echo $average;

演示

更加简洁和推荐的方式

$a = array_filter($a);
if(count($a)) {
    echo $average = array_sum($a)/count($a);
}

点击这里查看


8
请记住,您应该首先检查count()是否为正,否则您将得到除以零的错误。 - Shane N
10
array_filter函数会同时移除零值,这会使平均数产生偏差。 - Milo LaMar
1
@MiloLaMar:是的,请查看下面Don't Panic的回答。 - Mubin
你应该在过滤掉空值之后再进行count检查。 - Oleg
count() 函数的双重使用会增加不必要的开销。你可以选择 $count = count($a); 或者 if($a)。两种方法都足够好。我会使用 if($a),因为它避免了在空数组上调用 count(),但对于刚开始学习该语言的人来说可能更难理解。 - Ismael Miguel

26

接受的答案对于示例值有效,但通常仅使用array_filter($a)可能不是一个好主意,因为它会过滤掉所有实际的零值以及零长度的字符串。

甚至'0'也被解释为false,所以你应该使用一个明确排除零长度字符串的过滤器。

$a = array_filter($a, function($x) { return $x !== ''; });
$average = array_sum($a) / count($a);

使用PHP 7.4+,您可以使用 箭头函数 的语法 array_filter($a, fn($x)=>$x !== '');来过滤数组。 - Ismael Miguel

7
echo array_sum($a) / count(array_filter($a));

你需要执行 count(array_filter($a)) 才能排除空值。 - JimL

1
作为一个晚期的检查,项目控制应该使用数字检查来完成。否则,像这样的 $array = [1.2, 0.33, [123]] 将破坏计算:
// 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));

最后:
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);
}

学分:froq.util.Arrays


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接