- 
      
- 
        Save ischenkodv/262906 to your computer and use it in GitHub Desktop. 
| function calculate_median($arr) { | |
| $count = count($arr); //total numbers in array | |
| $middleval = floor(($count-1)/2); // find the middle value, or the lowest middle value | |
| if($count % 2) { // odd number, middle is the median | |
| $median = $arr[$middleval]; | |
| } else { // even number, calculate avg of 2 medians | |
| $low = $arr[$middleval]; | |
| $high = $arr[$middleval+1]; | |
| $median = (($low+$high)/2); | |
| } | |
| return $median; | |
| } | |
| function calculate_average($arr) { | |
| $count = count($arr); //total numbers in array | |
| foreach ($arr as $value) { | |
| $total = $total + $value; // total value of array numbers | |
| } | |
| $average = ($total/$count); // get average value | |
| return $average; | |
| } | 
You probably want to sort your array before doing your median calculation.
function calculate_average($arr) {
    return array_sum($arr) / count($arr);
}There are some missing test cases:
<?php
$test = array(
    array(5,2,1,3,4),
    array(),
    array(1)
);
foreach($test as $arr){
    $count = count($arr);
    sort($arr);
    $mid = floor(($count-1)/2);
    $avg = ($arr)?array_sum($arr)/$count:0;
    $median = ($arr)?($arr[$mid]+$arr[$mid+1-$count%2])/2:0;
    echo 'avg: '.$avg."<br>";
    echo 'median: '.$median."<br>";
}
?>Or maybe:
<?php
function median($arr){
    if($arr){
        $count = count($arr);
        sort($arr);
        $mid = floor(($count-1)/2);
        return ($arr[$mid]+$arr[$mid+1-$count%2])/2;
    }
    return 0;
}
function average($arr){
    return ($arr) ? array_sum($arr)/count($arr) : 0;
}
$test = array(
    array(5,2,1,3,4),
    array(5,4,2,3,1,6),
    array(),
    array(1),
    array(2,4),
); 
foreach($test as $arr){
    echo 'avg: '.average($arr)."<br>";
    echo 'median: '.median($arr)."<br>";
}
?>For the scenario where the data set has non-numeric keys (or no elements):
function median(array $arr)
{
    if (0 === count($arr)) {
        return null;
    }
    // sort the data
    $count = count($arr);
    asort($arr);
    // get the mid-point keys (1 or 2 of them)
    $mid  = floor(($count - 1) / 2);
    $keys = array_slice(array_keys($arr), $mid, (1 === $count % 2 ? 1 : 2));
    $sum  = 0;
    foreach ($keys as $key) {
        $sum += $arr[$key];
    }
    return $sum / count($keys);
}
These solutions are nicely understandable but not optimally efficient since they involve fully sorting the array before getting the median out of it.
The optimal efficiency for getting a median is actually O(n) not O(n log n).  Have you tried implementing Hoare's Selection algorithm in PHP?
Someone else mentioned it at:  http://stackoverflow.com/questions/4201292/on-algorithm-to-find-the-median-of-a-collection-of-numbers
As BramVanroy and other mentioned, array needs to be sorted. In my case I used sort($arr);.
Rewritten from javascript https://stackoverflow.com/a/45309555/2298745
Median PHP:
function median($values) {
  $count = count($values);
  if ($count === 0)  return null;
  asort($values);
  $half = floor($count / 2);
  if ($count % 2) return $values[$half];
  return ($values[$half - 1] + $values[$half]) / 2.0;
}
hey! I
m uusing your code in a small project of mine (https://github.com/mad-de/PlaCoTo/blob/master/site/resources/functions_calculate_placements.php). Is that alright with you and whats the best way to give you credit?best wishes and thanks for your coding efforts!