84

Example:

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

Actually how to find average value from this array excluding empty. please help to resolve this problem.

1
  • 4
    You should not define integers as strings. Instead of $a[] = '56'; it should be $a[] = 56; Commented Jun 6, 2019 at 7:23

4 Answers 4

174

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

Sign up to request clarification or add additional context in comments.

5 Comments

Keep in mind that you should first check to ensure count() is positive, otherwise you'll get a divide by zero error
array_filter would remove zeros also, skewing the average.
@MiloLaMar: yes, for that please check Don't Panic's answer below.
You should make count check AFTER you've filtered out empty values
The double use of the count() an add some needless overhead from calling count() multiple times. You can either do $count = count($a); or just do if($a). Both are good enough solutions. I would use if($a) which saves on calling count() on empty arrays, but is harder to understand for those starting to learn the language.
27

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);

1 Comment

With PHP 7.4+, you can do array_filter($a, fn($x)=>$x !== '');, using the syntax for arrow function.
7
echo array_sum($a) / count(array_filter($a));

1 Comment

you need to do count(array_filter($a)) in order to not include the empty values.
2

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.