2015-12-18 6 views
0

У меня есть массив целых чисел:PHP - получить максимально возможное целое состязание из массива целых чисел

$intArr = [2, 4, 8, 16]; 

Дан $ inputInt из 8, мне нужно больше всего целочисленного матч из этого массива, который должен вернуться 8 конечно.

Следующая функция нуждается в модификации:

function getBiggestMatch($intputInt) { 
    $intArr = [2, 4, 8, 16]; 

    foreach($intArr as $key => $value) { 
     if($key < $intputInt) { 
      $biggestMatch = $value; 
     } 
    } 

    return $biggestMatch; 
} 

$biggestMatch = getBiggestMatch(8); // should return 8, but returns 2 now 

Эта функция возвращает 2, потому что это первый раз, когда $ ключ < $ intInput. Желаемый результат должен быть 8 из $ intArr.

+0

Вы пробовали что-то, чтобы добраться до своей цели? – Rizier123

+0

@ Rizier123 да, момент. Я нажал Enter случайно, не отправив ни одного кода :-) – Beeelze

+0

Я плохо понимаю. Каков ваш желаемый результат в вашем примере кода? – ElChiniNet

ответ

0

Сравните $value, а не $key. Это возвращение 8.

<?php 
function getBiggestMatch($intputInt) { 
    $intArr = [2, 4, 8, 16]; 

    foreach($intArr as $key => $value) { 
     if($value <= $intputInt) { 
      $biggestMatch = $value; 
     } 
    } 

    return $biggestMatch; 
} 

echo getBiggestMatch(8); // should return 8, but returns 2 now 
?> 
+0

Я забыл упомянуть, что мой массив фактически состоял из нескольких пар ключ => значений. Поэтому мне пришлось сопоставлять ключ $, но использование операторов <= 'действительно на самом деле делало трюк. – Beeelze

+0

Ваш код не работает, если значение равно 0, оно также не работает, если оно равно 15 ... – Rizier123

+0

Вход никогда не будет 0. – Beeelze

2

Это должно работать для вас:

Прежде всего, просто чтобы убедиться, мы индексировать массив и сортировать его с 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 
0

Вы должны сделать двойную проверку, потому что если массив не имеет порядок последнее второстепенное значение будет возвращать:

function getBiggestMatch($intputInt) { 

    $intArr = [4, 8, 2, 16]; 

    $maxInt = false; 

    foreach($intArr as $key => $value) { 

     if($intputInt >= $value && $maxInt < $value) $maxInt = $value; 

    } 

    return $maxInt; 
} 

echo getBiggestMatch(12); 

ideone code

EDIT

В соответствии с рекомендацией @ Rizier123, то функция должна найти максимальное близкого значения (я не очень хорошо понял исходный вопрос), это может быть возможным решением:

function getBiggestMatch($intputInt) { 

    $intArr = [4, 8, 2, 16]; 

    $maxInt = false; 
    $diference = 0; 

    foreach($intArr as $key => $value) { 

     if($diference == 0 || ($diference > 0 && abs($intputInt - $value) < $diference) ) { 

      $maxInt = $value; 

      $diference = abs($intputInt - $value); 

     } 

    } 

    return $maxInt; 
} 

echo getBiggestMatch(15); 

ideone code

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