php Ближайший младший номер в массиве - PullRequest
3 голосов
/ 12 декабря 2010

У меня есть массив, например (это может быть что угодно, но он уже упорядочен):

array(1,7, 12, 18, 25);

Мне нужно найти, какое число ближе всего к этому массиву.

Принимая вышеуказанный массив:

$needle = 11;

Число в массиве, которое я хочу получить, равно 7. Самое близкое число к 11 должно быть 12, но я не хочу самое близкое число, я хочу младшее самое близкое число, если это имеет смысл.

Другие примеры:

  • Ввод 26 полученный номер должен быть 25
  • Ввод 1 полученный номер должен быть 1
  • Ввод 6 полученный номер должен быть 1
  • Ввод 7 полученный номер должен быть 7
  • Ввод 16 полученный номер должен быть 12

Я нашел хорошую функцию, но она получает только самое близкое число, а не младшее ближайшее число:

function closestnumber($number, $candidates) {
 for($i = 0; $i != sizeof($candidates); $i++) {
  $results[$i][0] = abs($candidates[$i] - $number);
  $results[$i][1] = $i;
 }
 sort($results);
 $end_result['closest'] = $candidates[$results[0][1]];
 $end_result['difference'] = $results[0][0];
 return $end_result;
}

$closest = closestnumber(8,array(1,7, 12, 18, 25));
echo "Closest: ".$closest['closest']."<br>";
echo "Difference: ".$closest['difference'];

Заранее спасибо.

Ответы [ 3 ]

5 голосов
/ 12 декабря 2010
$myArray = array(1,7, 12, 18, 25); 
$needle = 11; 

$resultKey = array_search(max(array_intersect(array_values($myArray),range(0,$needle))),$myArray); 
$result = $myArray[$resultKey];

EDIT

Предполагается, что значения массива всегда будут положительными целыми числами

Упрощенная версия

$myArray = array(1,7, 12, 18, 25); 
$needle = 11; 

$result = max(array_intersect(array_values($myArray),range(0,$needle))); 
2 голосов
/ 12 декабря 2010

Это похоже на домашнее задание, но я буду тебя шутить:

function closestnumber($number, $candidates) {
    $last = null;
    foreach ($candidates as $cand) {
        if ($cand < $number) {
            $last = $cand;
        } else if ($cand == $number) {
            return $number;
        } else if ($cand > $number) {
            return $last;
        }
    }
    return $last;
}
1 голос
/ 12 декабря 2010

Тестируйте только тех кандидатов, которые меньше или равны вашему числу.И если вы всегда помните только лучшее решение, вам не нужно сортировать решения, чтобы найти лучшее.

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

...