【问题标题】:First next and first last based on number基于数字的第一个下一个和最后一个
【发布时间】:2016-09-02 06:27:51
【问题描述】:

我在 PHP 中有一些这样的数组

$numbers = array('1','3','4','5','6','7','8','9','0','11','123','89');

以及当前可以像这样随机的数字

$currentNumber = 32;

我需要的是仅输出数组中小于$currentNumber 的第一个数字和大于$currentNumber 的数组中的第一个较大数字

我知道我可以输出所有更低和更大的,只放我需要一个:(

foreach ($numbers as $number){
     if ($number > $currentNumber){
          echo $number .' Number is bigger';
     }
     else{
          echo $number .' Number is lower';
     } 
}

【问题讨论】:

    标签: php arrays date foreach


    【解决方案1】:

    下面的代码将只从数组中找到小于 $currentNumber 的第一个数字和从大于 $currentNumber 的数组中找到第一个更大的数字

    $firstLowestNum=$firstHigherNum=null;
    $currentNumber=32;
    
    $numbers = array('1','3','4','5','6','7','8','9','0','11','123','89');
    
    foreach ($numbers as $number){
     if ($number > $currentNumber && is_null($firstHigherNum)){
      $firstHigherNum =$number;
    }
    else if(is_null($firstLowestNum)){  
      $firstLowestNum =$number;
    }
    }
    var_dump($firstLowestNum,$firstHigherNum);
    

    【讨论】:

      【解决方案2】:
          $numbers = array('1','3','4','5','6','7','8','9','0','11','123','89');
      $currentNumber = 32;
      
      
      $greater_numbers= array();
      $lower_numbers= array();
      foreach ($numbers as $number){
       if ($number > $currentNumber){
      
        array_push($greater_numbers,$number);
      }
      else{
       array_push($lower_numbers,$number);
      }
      }
      sort($greater_numbers);
      sort($lower_numbers);
      echo "first greater number".$greater_numbers[0];
      echo "first lowest number".end($lower_numbers);
      

      【讨论】:

        【解决方案3】:

        你可以这样做:

        <?php
        $numbers = array('1','3','4','5','6','7','8','9','0','11','123','89');
        
        $currentNumber = 32;
        
        $firstLowerNumber = null;
        $firstBiggerNumber = null;
        
        foreach ($numbers as $number) {
            if ($number < $currentNumber && $firstLowerNumber === null) {
                $firstLowerNumber = $number;
            }
            if ($number > $currentNumber && $firstBiggerNumber === null) {
                $firstBiggerNumber = $number;
            }
        }
        
        echo $firstBiggerNumber === null ? 'No number is bigger than ' . $currentNumber . PHP_EOL : $firstBiggerNumber . ' Number is bigger' . PHP_EOL;
        echo $firstLowerNumber === null ? 'No number is lower than ' . $currentNumber . PHP_EOL : $firstLowerNumber .' Number is lower' . PHP_EOL;
        

        【讨论】:

          【解决方案4】:

          假设您的$numbers 未排序。

          $numbers = array('1','3','4','5','6','7','8','9','0','11','123','89');
          $currentNumber = 32;
          
          $closestLower = min($numbers);//or some minimum constant as lower bound
          $closestHigher = max($numbers);//or some maximum constant as upper bound
          
          foreach($numbers as $number){
              if($number < $currentNumber && $number > $closestLower){
                  $closestLower = $number;
              }
              if($number > $currentNumber && $number < $closestHigher){
                  $closestHigher = $number;
              }
          }
          echo $closestLower."\n";
          echo $closestHigher."\n";
          

          【讨论】:

            【解决方案5】:

            您可以对数组进行升序排序并获取第一个较低的元素,它将是该数组中的最低元素。

            然后对你的数组进行降序排序,得到第一个更高的元素,它将是这个数组中的最高元素。

            $numbers = array('1','3','4','5','6','7','8','9','0','11','123','89');
            
            $input=32;
            $max=0;
            $min=0;
            sort($numbers);
            foreach($numbers  as $index=>$value){
                if ($value < $input){
                    $min=$value;
                    break;
                } 
            }
            
            rsort($numbers);
            foreach($numbers  as $index=>$value){
                if ($value > $input){
                    $max=$value;
                    break;
                } 
            }
            

            【讨论】:

              【解决方案6】:
              $smaller = $bigger = null;
              
              foreach ($numbers as $number) {
                  if ($number < $currentNumber) {
                      $smaller = $number;
                  }
              
                  if ($number > $currentNumber) {
                      $bigger = $number;
                      break;
                  }
              }
              
              echo $smaller, $bigger;
              

              当然,这仅在$numbers 数组已排序时才有效。如果不能保证,请先使用sort 函数。

              【讨论】:

              • 如果第一个数字大于当前数字,它将打破循环
              • 更好的行为是什么?当然,这是在这种情况下所希望的。
              【解决方案7】:

              假设数组已排序,只需使用两个标志来指示您是否找到了较低和较高的数字。无需对数组进行两次迭代。

                  $lowerNumberFound= false;
                  $higherNumberFound = false;
                  foreach ($numbers as $number){
                   if (!higherNumberFound && $number > $currentNumber) {
                       echo $number .' Number is bigger';
                       $higherNumberFound = true;
                  }
                  else if(!lowerNumberFound && $number < $currentNumber {
                      echo $number .' Number is lower';
                      $lowerNumberFound= true;
                  }
              

              【讨论】:

                【解决方案8】:

                first number from array that is lower than $currentNumber 我假设您需要在订单中找到的第一个值(如果我们继续前进,可能还有其他值,但您需要第一个)。

                一种更快的方法是对数组进行两次迭代。当你得到值时打破循环。

                 $currentNumber = 32;
                 $min=0; 
                 $max=0;
                 foreach($numbers as $value){
                 if($value<$currentNumber){
                    $min = $value;
                    break;
                   }
                 }
                
                foreach($numbers as $value){
                  if($value>$currentNumber){
                  $max = $value;
                  break;
                 }
                }
                

                【讨论】:

                • 如果数组中有多个元素小于 $currentNumber,则您的 $min 值将不正确。
                • @Tom 我猜这就是用户要问的first number from array that is lower than $currentNumber
                • 啊,你可能是对的 - @miomir-dancevic,你能澄清一下吗?
                • @Tom 我也更新了我的答案,我已经提到了这一点
                【解决方案9】:

                以下方式使用

                $numbers = array('1','3','4','5','6','7','8','9','0','11','123','89');
                
                $currentNumber = 32;
                
                sort($numbers);
                foreach($numbers as $key=>$row){
                    if($currentNumber <$row){
                        break;
                    }
                
                }
                echo 'lower Number = '. $numbers[$key==2?$key-2:$key-1].'<br>';
                echo 'Greater Number = '. $numbers[$key].'<br>';
                

                检查最后一个值是否与当前值相同,它需要更多的扭曲

                【讨论】:

                • 很好,除非 $currentNumber 在数组中 - 在这种情况下,$numbers[$key - 1] 不一定更低。
                • 为什么你投了反对票,伙计,请通过当前数字 = 0 来检查,你也请通过在数组中保留两个值来检查
                • 正如我在评论中所说的 - $numbers = array(1, 32, 33); 将破坏此代码。
                • 是的,请更新代码,如果还有其他问题,请告诉我
                • 您的更新仍然是错误的,因为在我刚刚提供的情况下,它将返回更大的数字 32。
                【解决方案10】:
                $numbers = array('1','3','4','5','6','7','8','9','0','11','123','89');
                $currentNumber=32;
                
                sort( $numbers );
                while( list( $key, $value ) = each( $numbers ) ){
                    if( $currentNumber > $value ){
                        $low=$value;
                        break;
                    }
                }
                while( list( $key, $value ) = each( $numbers ) ){
                    if( $currentNumber < $value ){
                        $high=$value;
                        break;
                    }
                }
                echo 'Low:'.$low.', High:'.$high;
                

                【讨论】:

                • 不好,因为它返回 0??如果 number 是 32,它必须返回 11,和 89
                • 因此应该重新表述您的问题,因为您似乎真正想要做的是获取最接近$currentNumber的数字
                【解决方案11】:
                <?php
                
                    $numbers = array('1','3','4','5','6','7','8','9','0','11','123','89');
                
                    $currentNumber =7;
                    $low_number=$high_number= false;
                
                        foreach ($numbers as $number){
                
                         if (!$high_number && $number > $currentNumber) {
                             echo $number .' Number is bigger</br>';
                             $high_number = true;
                        }
                        else if(!$low_number && $number < $currentNumber) {
                            echo $number .' Number is lower</br>';
                            $low_number= true;
                        }
                
                        }
                    ?>
                

                更新 1

                        <?php
                
                        $numbers = array('1','3','4','5','6','7','8','9','0','11','123','89');
                
                        $currentNumber =7;
                
                       $new = array_flip($numbers);
                
                            foreach ($new  as $key=>$number){
                
                                    if($key==$currentNumber)
                                    {
                
                                        echo prev($new)."Number is lower</br>";
                
                                        echo next($new)."Number is bigger</br>";
                
                                        break;
                                    }
                
                            }
                
                    ?>
                

                【讨论】:

                • 返回 1 个数字较小8 个数字较大
                • 这是你的预期结果 na @MiomirDancevic
                • 没有先小后大
                • 如果 $currentNumber =7 表示 6 数字较小而 8 数字较大,是吗?
                • 是的,一定是这样的
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2016-02-29
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-08-06
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多