【问题标题】:Simple PHP. Try to get rid of nested if's [duplicate]简单的PHP。尝试摆脱嵌套的 if [重复]
【发布时间】:2012-10-20 20:12:17
【问题描述】:

可能重复:
Compare multiple values in PHP

请有人帮我找到更好的写作方式。我觉得好像必须有比嵌套 if 更好的东西。我已经尝试过搜索,但我不知道我在寻找什么。

代码表示如果会话变量“auth”不完全等于 0、1、2 或 3,则重定向到登录页面。

if($_SESSION['auth']!=0){
   if($_SESSION['auth']!=1){
      if($_SESSION['auth']!=2){
         if($_SESSION['auth']!=3){
            header("location:login.php");
         }
      }
   }
}

我最初的想法是做这样的事情。

if($_SESSION['auth']<=0 || $_SESSION['auth']>=3){
   header("location:login.php");
}

但这不考虑整数值的分数。我只想允许整数值。我的下一个想法是这个。

if($_SESSION['auth']!=0 && $_SESSION['auth']!=1 && $_SESSION['auth']!=2 && $_SESSION['auth']!=3){
   header("location:login.php")
}

但是这种方式与所有嵌套的 if 没有太大区别。让我知道我是否只是在尝试修复未损坏的东西。先感谢您。我正在寻找相关主题的链接(最好是 PHP 手册),而不是解决方案。

【问题讨论】:

  • 这里的实际问题是,浮点数如何最终出现在变量中?这是一些模糊的授权方案吗? (“错误:您只能在一定程度上编辑此页面。”)
  • 您控制会话。如果你不把小数值放在那里,就不会有小数值。可以安全地假设,如果你只输入了整数,你只会得到整数。
  • 浮点数是不允许的。但我想尽量准确。
  • 现在,看着答案,我为自己没有考虑使用数组而感到羞愧。
  • @Jeremy 这是严重错误的想法。试图通过测试没有业务的价值来“精确”,正在积极地伤害你。您应该assert 会话中的值是一个整数。如果不是这样,您的程序应该会乱七八糟地死掉,以便您找到错误的根源。您可以完全控制会话。如果某个值以某种方式进入了您不希望出现的位置,那是因为您的代码中存在错误,您需要跟踪并修复它,而不是每次访问会话时都处理后果.

标签: php


【解决方案1】:

是的,你是。更简单的方法可能是inarray()

$values = array('0','1','2','3');
if(!in_array($_SESSION['auth'], $values, true)
//do something

甚至更短

if(!in_array($_SESSION['auth'], array('0','1','2','3'), true)
//do something

最好使用第一个选项,以防您将来可能想将其与更多值进行比较。

【讨论】:

  • 谢谢。对于解决方案和链接。
【解决方案2】:

您可以保留一组值来检查:

$auth_array = array('0', '1', '2', '3');
if(!in_array($_SESSION['auth'], $auth_array)){
    header("location:login.php");
}

【讨论】:

    【解决方案3】:

    您可以使用in_array 轻松检查$_SESSION['auth'] 是否等于您要查找的值之一。

    if (in_array ($_SESSION['auth'], array (0,1,2,3)) == false)
      header ("Location: ...");
    

    【讨论】:

      【解决方案4】:

      您自己的解决方案很好:

      if($_SESSION['auth']<=0 || $_SESSION['auth']>=3){
         header("location:login.php");
      }
      

      如果您担心十进制值,请不要担心——如果您的代码只将其设置为整数,那么就只能如此了。但是,如果您对此感到担心,只需通过类型转换将值强制为整数:

      $_SESSION['auth'] = (int)$_SESSION['auth'];
      

      不用再担心分数了。

      【讨论】:

        猜你喜欢
        • 2017-01-14
        • 2021-10-02
        • 1970-01-01
        • 2013-12-15
        • 2020-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-12
        相关资源
        最近更新 更多