2010-12-12 5 views
3

У меня есть массив, например (это может быть что угодно, но это уже заказано):PHP Ближайший младший номер в массиве

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']; 

Спасибо заранее.

ответ

2

Это выглядит как домашнее задание, но я буду юмор Вы:

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; 
} 
+0

Хорошее общее решение. '$ last = null' может быть более подходящим инициализатором. '$ key' не используется или не требуется. Бинарный поиск может быть более подходящим, если массив большой. – Matthew

+0

Обратите внимание, что для этого необходимо, чтобы значения сортировались в порядке возрастания. – Gumbo

+0

Хорошие точки, отредактированные. @Gumbo: Он утверждает, что массив уже упорядочен. – Andre

1

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

Так попробуйте это:

function closestnumber($number, $candidates) { 
    $best = null; 
    foreach ($candidates as $candidate) { 
     if ($candidate <= $number) { 
      if (is_null($best) || $diff > $number - $candidate) { 
       $diff = $number - $candidate; 
       $best = $candidate; 
      } 
     } 
    } 
    if (is_null($best)) { 
     return false; 
    } 
    return array('closest' => $best, 'difference' => $diff); 
} 
5
$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))); 
+0

вы можете полностью удалить 'array_search()' и строку '$ result'. – salathe

+0

@salathe - правда, мое чрезмерное применение. –

+0

@stereofrog - true, и использование min ($ myArray) также увеличит допустимый массив, содержащий отрицательные целые числа. –

Смежные вопросы