【问题标题】:Find to closest higher and lower number in an array in loop在循环中查找数组中最接近的较高和较低数字
【发布时间】:2015-09-29 10:22:14
【问题描述】:

我有一个数组。给定一个数字 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);
?>    

【问题讨论】:

    标签: php numbers closest


    【解决方案1】:

    使用代码块以简洁易读的方式编写代码

    $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;
                   }
              }
      }
    

    【讨论】:

    • 感谢回复 bt 我想要两次迭代
    • 两次迭代是什么意思?
    • 我想要两个结果,例如 if $v=104;
    • 那么输出应该是 102,103,104,105,106
    【解决方案2】:

    试试这个:

    ?>

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

    【讨论】:

    • 我想要两个结果,例如 $v=58;输出应该是 lesser=52,55 然后 $v greater=66,74
    • 此代码不适用于数组中已经存在的值
    • 我想要这个东西循环
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多