>我有一个字符串转换为具有 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