Это должно работать для вас:
Прежде всего, просто чтобы убедиться, мы индексировать массив и сортировать его с array_values()
и sort()
.
После этого мы проходного массива с петлей в то время как и всегда проверяйте, если следующий ключ существует и в настоящее время key => element
меньше, чем на входе $number
:
Check if next element exists Check that current array value is smaller than the input
┌─────────┴───────┐ ┌─────────┴────────┐
while(isset($arr[$key+1]) && $arr[$key] < $number)
$key++; //→ Go to next key, which must exist
Теперь после цикла в то время как $key => value
может указать к значению, которое совпадает с входом или выше.Теперь мы просто проверить следующее:
value == input
($arr[$key] == $number
) => вернуть текущее значение (return $arr[$key];
)
- расстояние между текущим значением на входе (
$arr[$key] - $number
) будет меньше (<
), чем расстояние между последним значением в вход ($number - $arr[$key-1]
) => вернуть текущее значение (return $arr[$key];
)
- еще => возвращают последнее значение (
return $arr[$key-1];
)
Код:
<?php
function getNearestMatch($number) {
$arr = array_values([2, 4, 8, 16, 23]);
sort($arr);
$key = 0;
while(isset($arr[$key+1]) && $arr[$key] < $number)
$key++;
if($arr[$key] == $number || !isset($arr[$key-1]) || $arr[$key] - $number < $number - $arr[$key-1])
return $arr[$key];
else
return $arr[$key-1];
}
//To test it we pass some values to the function
foreach([0, 2, 3, 4, 8, 12, 22, 23, 24] as $v)
echo getNearestMatch($v) . PHP_EOL;
?>
выход:
2
2
2
4
8
8
23
23
23
Вы пробовали что-то, чтобы добраться до своей цели? – Rizier123
@ Rizier123 да, момент. Я нажал Enter случайно, не отправив ни одного кода :-) – Beeelze
Я плохо понимаю. Каков ваш желаемый результат в вашем примере кода? – ElChiniNet