HiveBrain v1.2.0
Get Started
← Back to all entries
patternphpMinor

Finding the average, the five smallest, and the five largest numbers in an array

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
smallestthefivearraynumbersaveragelargestfindingand

Problem

I am going though some PHP arrays exercises on w3resource. I have just completed the following:

  • Write a PHP script to calculate and display average temperature, five lowest and highest temperatures.



Recorded temperatures : 78, 60, 62, 68, 71, 68, 73, 85, 66, 64, 76, 63, 75, 76, 73, 68, 62, 73, 72, 65, 74, 62, 62, 65, 64, 68, 73, 75, 79, 73

Here is my code:

";
    
    $temperatures = array(78, 60, 62, 68, 71, 68, 73, 85, 66, 64, 76, 63, 75, 76, 73, 68, 62, 73, 72, 65, 74, 62, 62, 65, 64, 68, 73, 75, 79, 73);
    
    function listvalues($value)
    {
        echo "$value, ";
    }
    
    function printAverage($array)
    {
        $total = 0;
        foreach($array as $element)
        {
            $total += $element;
        }
        echo number_format($total / count($array), 1);
    }
    
    echo "Recorded temperatures : ";
    array_walk($temperatures, "listvalues");
    echo "";
    
    echo "Average Temperature is : ";
    printAverage($temperatures);
    echo "";
    
    //sort the temperatures in ascending order for both of the following lists.
    sort($temperatures);
    
    //print the first 5 values
    echo "List of five lowest temperatures : ";
    for($i = 0; $i "; 
    
    //print the last 5 values
    echo "List of five highest temperatures : ";       
    for($i = count($temperatures) - 5; $i ";
    
    echo "";
?>


And here is its output:

Recorded temperatures : 78, 60, 62, 68, 71, 68, 73, 85, 66, 64, 76, 63, 75, 76, 73, 68, 62, 73, 72, 65, 74, 62, 62, 65, 64, 68, 73, 75, 79, 73,
Average Temperature is : 69.8
List of seven lowest temperatures : 60, 62, 62, 62, 62,
List of seven highest temperatures : 76, 76, 78, 79, 85,


(I paid no attention to fixing the commas at the end of each part of the output, for now.)

My questions are:

-
Is this an appropriate use of array_walk()? Is it more appropriate to use a foreach() loop?

-
Is ($total / count($array) the easiest way to find the average of an array, and is

Solution

There are a number of built-in functions in PHP that would make your code shorter and more direct.

The first is implode. implode takes and optional glue string and an array of values, and joins them together into a single string. So for implode(", ", array(1, "a", 3)), it would return "1, a, 3". This avoids the need to loop over the elements of an array to print them with a separator, and to catch the last case where there should be no separator.

The second is array_sum. This, as its name suggests, takes an array and sums the values. This also avoids an explicit loop.

The third is array_slice. This function will take an array, and return a portion of it based on the given parameters. It can even be used to index in reverse with a negative offset.

Putting it all together, we get the following:

";

    $temperatures = array(78, 60, 62, 68, 71, 68, 73, 85, 66, 64, 76, 63, 75, 76, 73, 68, 62, 73, 72, 65, 74, 62, 62, 65, 64, 68, 73, 75, 79, 73);

    echo "Recorded temperatures : ";
    echo implode(", ", $temperatures);
    echo "";

    echo "Average Temperature is : ";
    echo number_format(array_sum($temperatures) / count($temperatures), 1);
    echo "";

    //sort the temperatures in ascending order for both of the following lists.
    sort($temperatures);

    //print the first 5 values
    echo "List of five lowest temperatures : ";
    echo implode(", ", array_slice($temperatures, 0, 5));
    echo ""; 

    //print the last 5 values
    echo "List of five highest temperatures : ";
    echo implode(", ", array_slice($temperatures, -5, 5));
    echo "";

    echo "";
?>

Code Snippets

<?php
    echo "<pre>";

    $temperatures = array(78, 60, 62, 68, 71, 68, 73, 85, 66, 64, 76, 63, 75, 76, 73, 68, 62, 73, 72, 65, 74, 62, 62, 65, 64, 68, 73, 75, 79, 73);

    echo "Recorded temperatures : ";
    echo implode(", ", $temperatures);
    echo "<br>";

    echo "Average Temperature is : ";
    echo number_format(array_sum($temperatures) / count($temperatures), 1);
    echo "<br>";

    //sort the temperatures in ascending order for both of the following lists.
    sort($temperatures);

    //print the first 5 values
    echo "List of five lowest temperatures : ";
    echo implode(", ", array_slice($temperatures, 0, 5));
    echo "<br>"; 

    //print the last 5 values
    echo "List of five highest temperatures : ";
    echo implode(", ", array_slice($temperatures, -5, 5));
    echo "<br>";

    echo "</pre>";
?>

Context

StackExchange Code Review Q#91959, answer score: 8

Revisions (0)

No revisions yet.