2015-09-29 5 views
0

У меня есть массив. Учитывая число 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

thnks для ответа bt я хочу две итерации –

+0

Что вы подразумеваете под буксирными итерациями? – Mahmoud

+0

Я хочу два результата, например, если $ v = 104; –

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>"; 
?> 

Edited иметь два НИЖНИЕ И ДВА ВЫСШЕГО ДАЖЕ КОГДА МАТЧА

<?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

Я хочу два результата, например, для $ v = 58; выход должен быть меньше = 52,55, тогда $ v больше = 66,74 –

+0

этот код не работает для тех значений, которые alredy существует в массиве –

+0

Я хочу эту вещь ina loop –