public static function median(array $numbers)
{
if (empty($numbers)) {
return null;
}
// Reset the array key indexes because we don't know what might be passed in
$numbers = array_values($numbers);
// For odd number of numbers, take the middle indexed number
if (count($numbers) % 2 == 1) {
$middle_index = intdiv(count($numbers), 2);
return self::kthSmallest($numbers, $middle_index);
}
// For even number of items, take the mean of the middle two indexed numbers
$left_middle_index = intdiv(count($numbers), 2) - 1;
$left_median = self::kthSmallest($numbers, $left_middle_index);
$right_middle_index = $left_middle_index + 1;
$right_median = self::kthSmallest($numbers, $right_middle_index);
return self::mean([$left_median, $right_median]);
}