Найти ближайший верхний и нижний номер в массиве в цикле

У меня есть массив. Учитывая число X (которое не должно содержаться в массиве), я хочу найти как следующее большее, так и следующее меньшее число X в массиве в одном цикле. Мой код:

<?php
$a = array(1, 8, 23, 25, 40,41,42,47, 52, 55, 66, 74,75, 76,77,78, 95, 102,103, 104, 105,106, 126, 128, 140, );
$v = 104;
sort($a);
$nearestGreater = null;
$nearestLower = null;
foreach ($a as $key => $val) {
if ( $v<=$val) {
$nearestGreater = (isset($a[$key + 1])) ? $a[$key + 1]: $nearestGreater;
$nearestLower = (isset($a[$key - 1])) ? $a[$key - 1]: $nearestLower;
break;
}
}
var_dump($nearestLower);
echo "<br/>".$v."<br/>";
var_dump($nearestGreater);
unset($a);
?>

0

Решение

Напишите свой код в чистом и удобочитаемом виде, используя кодовый блок

$nearestGreater=null;
$nearestLower = null;
$a = array(1, 8, 23, 25, 40,41,22,47, 52, 55, 66, 74,75, 76,77,78, 95, 102,103, 104, 105,106, 126, 128, 140, );
$v = 104;
foreach( $a as $val)
{
if($val < $v)
{
if(isset($nearestLower))
{    if($nearestLower < $val)
$nearestLower=$val;
}
else
{
$nearestLower=$val;
}
}

if($val > $v)
{
if(isset($nearestGreater))
{    if($nearestGreater > $val)
$nearestGreater=$val;
}
else
{
$nearestGreater=$val;
}
}
}
0

Другие решения

Попробуй это:

?>

<?php
$a = array(1, 8, 23, 25, 40,41,42,47, 52, 55, 66, 74,75, 76,77,78, 95, 102,103, 104, 105,106, 126, 128, 140, );
sort($a);
$v = 58;
$lesser = null;
$greater = null;
foreach($a as $key => $current){
if($current <= $v){
$lesser     = $current;
$greater    = $a[($key+1)];
}else{

}
}
echo "<pre>";
print_r(array(
"lesser"    => $lesser,
"greater"   => $greater,
));
echo "</pre>";
?>

Отредактировано, чтобы иметь два нижних и два высших, даже когда матч

<?php
$allNumbers = array(1, 8, 23, 25, 40,41,42,47, 52, 55, 66, 74,75, 76,77,78, 95, 102,103, 104, 105,106, 126, 128, 140, );
sort($allNumbers);
$input = 55;
$index = array_search($input, $allNumbers);
if(empty($index)){
foreach($allNumbers as $key => $value){
if($value < $input){
$index = ($key + 0.5);
}else{
break;
}
}
}
$below = array(
$allNumbers[ceil($index - 2)],
$allNumbers[ceil($index - 1)],
);

$above = array(
$allNumbers[floor($index + 1)],
$allNumbers[floor($index + 2)],
);

echo "<pre>";
print_r(array(
"input" => $input,
"index" => $index,
"below" => $below,
"above" => $above,
));
echo "</pre>";
?>
0

А ты уже прошел курс программирования? Супер скидка!
Прокачать скилл $$$
×