从数字列表中获取极端情况

Joh*_*ohn -9 php numbers

如果我有一个像这样的数字列表:

10,9,8,8,9,7,6,5,4,6,7,8,11,10,12,14,16,20,30,29,28,29,27,25,20,18,15,10,8,5,4,1
Run Code Online (Sandbox Code Playgroud)

我想获得以下数字(符合此示例): 10,4,30,1

是否有可能编写一个能够获得这些极端的函数?

这些数字是图表的值,我想得到图表的高峰.

jpr*_*itt 5

我没有测试过这么多,并且它不适用于少于3点的任何东西,但这应该给你一个很好的起点.

<?php

$array = array(10,9,8,8,9,7,6,5,4,6,7,8,11,10,12,14,16,20,30,29,28,29,27,25,20,18,15,10,8,5,4,1);

$extremes = array();
$last = null;
$num = count($array);
for($i=0;$i<$num - 1;$i++) {
    $curr = $array[$i];
    if($last === null) {
        $extremes[] = $curr;
        $last = $curr;
        continue;
    }

    //min
    if($last > $curr && $curr < $array[$i + 1]) {
        $extremes[] = $curr;
    }
    //maxes
    else if ($last < $curr && $curr > $array[$i + 1]) {
        $extremes[] = $curr;
    }
    if($last != $curr && $curr != $array[$i + 1]) {
        $last = $curr;
    }
}
//add last point
$extremes[] = $array[$num - 1];

print_r($extremes);
Run Code Online (Sandbox Code Playgroud)

给你结果(你错过了列表中的一对):

Array
(
    [0] => 10
    [1] => 8
    [2] => 9
    [3] => 4
    [4] => 11
    [5] => 10
    [6] => 30
    [7] => 28
    [8] => 29
    [9] => 1
)
Run Code Online (Sandbox Code Playgroud)

如果你想让它完全像你的列表,你将不得不对数据应用一些平滑,或者对检测有一些容差.