У меня получилось быстрее собрать в массив все просадки PHP: <?php $data = array(1,2,3,10,6,1,4,5,6,7,42,33,30,38); $max = 0; $drawdowns = []; while (false !== $v = current($data)) { if ($max < $v) { if (next($data) === false) { break; } $max = $v; continue; } $drawdowns[] = $max - $v; next($data); } print_r($drawdowns); соответственно, PHP: echo max($drawdowns); --- Добавлено --- Из серединки цикла можно даже выбросить условие, но тогда в массив могут попадать нули (а это как-бы не просадка).
Коллеги, как-то у вас всё сложно. Победил лень и сделал оптимальный вариант: PHP: $result = 0; $max = reset($arr); foreach($arr as $v) { if($v > $max) { $max = $v; } if(($max - $v) > $result) { $result = $max - $v; } } var_dump($result); На php-5.6 работает в ~5 раз быстрее, чем у [vs] и в ~8 раз, чем у Deonis, на больших данных от ТС (90 записей). Про остальное громко промолчу п.с. Кстати Deonis, у тебя ещё и считает неправильно.