【问题标题】:How to check if a number falls in a given range如何检查数字是否在给定范围内
【发布时间】:2021-03-15 05:45:38
【问题描述】:

我有一个变量$user_id(数值)

想要检查 $user_id 是否在 1 - 1000 或 1001 - 2000 或 2001 - 3000 .... 99001 - 100000 的范围内

  1. 有没有办法做到这一点,而无需在 PHP 中编写 100 个 switchif 语句?
  2. 找到匹配项后,执行代码。

我知道这需要 while 和 for 循环。但无法正确编码。

【问题讨论】:

  • "有没有办法不用在 PHP 中编写 100 个 switch 或 if 语句来做到这一点?" 这完全取决于你打算如何处理这个范围。如果根据范围执行的代码完全不同,那么 switch/if-s 可能是你最好的选择。
  • "while 和 for 循环是必需的" -- 不正确,你当然不应该使用循环,因为范围可以通过一次性数学表达式确定。

标签: php logic


【解决方案1】:

这是最简单的方法:

    $check = 0;
    $nextCheck = $check+1001;
    while ($check < 100001) {
    If ($user_id > $check && $user_id < $nextCheck) {
      // Code ...
      break;
    } else {
       $check+=1000;
       $nextCheck+=1000;
    }
    }

【讨论】:

  • “试试这个”的答案在 Stackoverflow 上的价值很低,因为它们对教育/授权成千上万的未来研究人员几乎没有作用。
  • 我不会在我的一个项目中使用此代码。迭代多达 1000 次是不必要的工作。
  • 我认为是 100 循环而不是 1000。
  • 很遗憾,我没有要求你在所有项目中使用我的代码。
  • 是的。你是对的,这是 100 次不必要的迭代,我的错。您的答案仍然缺乏教育解释。 for() 循环具有更好的可读性。
【解决方案2】:

不生成数组。不要使用循环。使用数学来确定范围的上限,然后从该数字中减去 999 -- 完成。

*my sn-p 假设我们只处理 1 到 100000 之间的正值。

代码:(Demo)

$tests = [1, 999, 1000, 50001, 100000, 2999];

foreach ($tests as $test) {
    $upper = intval(($test - 1) / 1000) * 1000 + 1000;
    echo "$test is between " . ($upper - 999) . " and $upper\n";
}

输出:

1 is between 1 and 1000
999 is between 1 and 1000
1000 is between 1 and 1000
50001 is between 50001 and 51000
100000 is between 99001 and 100000
2999 is between 2001 and 3000

公式分解:

intval(            #3) remove decimals from difference
    ($test - 1)    #1) subtract one
    / 1000         #2) divide by 1000
)
* 1000             #4) multiply integer by 1000
+ 1000             #5) add 1000

【讨论】:

  • @Jestin 您接受的答案不是直接的,它是一种低效的“猜测和检查”技术。为什么有人不想使用我的数学单线?你甚至在答案下说它不起作用——你为什么要给它一个绿色的勾?!现在研究人员将偏向于次优答案。
【解决方案3】:

您可以将数字除以1000,因为您连续有 1000 个区间范围。

quotient * 1000 + 1 是区间的起始值,具有可被 1000 整除的数字的特殊极端情况,这只是区间的边界结束。

<?php

$tests = [1,999,1000,50001,100000,2999];

foreach($tests as $test_case){
    $quotient = intval($test_case / 1000);
    if($test_case % 1000 === 0){
        $start = $test_case - 1000 + 1;
        echo "$test_case : Range: ($start - $test_case)",PHP_EOL;
    }else{
        $start = $quotient * 1000 + 1;
        $end = ($quotient + 1) * 1000;
        echo "$test_case : Range: ($start - $end)",PHP_EOL;
    }
}

输出:

1 : Range: (1 - 1000)
999 : Range: (1 - 1000)
1000 : Range: (1 - 1000)
50001 : Range: (50001 - 51000)
100000 : Range: (99001 - 100000)
2999 : Range: (2001 - 3000)

演示: https://3v4l.org/apbqV

【讨论】:

    猜你喜欢
    • 2014-12-05
    • 2017-05-16
    • 2010-11-01
    • 1970-01-01
    • 2015-11-28
    • 2014-05-21
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    相关资源
    最近更新 更多