Я получаю ожидаемый результат, используя:
function getPercentile($array, $percentile)
{
$percentile = min(100, max(0, $percentile));
$array = array_values($array);
sort($array);
$index = ($percentile / 100) * (count($array) - 1);
$fractionPart = $index - floor($index);
$intPart = floor($index);
$percentile = $array[$intPart];
$percentile += ($fractionPart > 0) ? $fractionPart * ($array[$intPart + 1] - $array[$intPart]) : 0;
return $percentile;
}
$array = [9814106112,0,5692473344,360448,8514641920,5228150784,11731894272,7707688960,11325239296,360448,13382311936,11934347264,7919140864,7370223616,46461620224,360448];
$percentile = 25;
$result = getPercentile($array, $percentile);
var_dump($result); //float(3921203200)
Вы даете своей функции правильные аргументы?