查找数组中的下一个最高值


Find next highest value in an array

>我有一个字符串转换为具有 1 到 7 个值的数组,例如 3、1234567、1234、357、46 等

给定 1 到 7 之间的任何数字,如何找到数组中的下一个值?

$str=12345;
$arr=str_split($str);
$end=end($arr);
if ($day==$end) {
    $next=reset($arr);
} else {
    $loc=array_search($day, $arr)+1;
    $next=$arr[$loc];
}
print $next;
如果 day 为 1,则上述返回 2,如果 day 为 5,则返回 1,两者都是正确的,但如果 day 是 6 或 7,那么它不会返回正确的值,该值应该是

1 - 同样,如果数组为 1245 并且 day 为 3,它再次不返回正确的值,应该是 4。

我需要做什么才能使上述在所有情况下返回正确的值?

$values = array_filter($arr, function($v) use($day) {
    return $v > $day;
});
$value = $values ? array_shift($values) : array_shift($arr);

可能不是最佳的和未经测试的,但它应该有效。

当然,

执行此任务的方法有很多种。我将演示一种有效的方法,该方法在循环中使用递减来查找序列的下一个数字,而无需生成数组。在循环之前,声明 haystack 字符串中第一个数字的回退值。

这里有 5 个不同的测试用例,其中搜索 5 之后的数字。

代码:(演示)

$tests = [
    '3',
    '1234567',
    '1234',
    '357',
    '46'
];
$find = 5;
++$find;
foreach ($tests as $test) {
    $found = $test[0];
    for ($i = strlen($test) - 1; $i >= 0; --$i) {
        if ($test[$i] < $find) {
            break;
        }
        $found = $test[$i];
    }
    echo "Found $found'n";
}

输出:

Found 3
Found 6
Found 1
Found 7
Found 6