示例:
$a[] = '56';
$a[] = '66';
$a[] = '';
$a[] = '58';
$a[] = '85';
$a[] = '';
$a[] = '';
$a[] = '76';
$a[] = '';
$a[] = '57';
实际上,如何从这个数组中找到排除空的平均值。请帮助解决这个问题。
首先需要删除空值,否则平均值将不准确。
所以
$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);
}
请参阅此处
接受的答案适用于示例值,但通常简单地使用array_filter($a)
可能不是一个好主意,因为它会过滤掉任何实际的零值以及零长度字符串。
即使'0'
的计算结果为false,也应该使用明确排除零长度字符串的筛选器。
$a = array_filter($a, function($x) { return $x !== ''; });
$average = array_sum($a) / count($a);
echo array_sum($a) / count(array_filter($a));
作为一种新的方法,项控件应该使用数字检查来完成。否则,像这样的$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