43

我有(或没有)一个$_GET['myvar']来自我的查询字符串的变量,我想检查这个变量是否存在以及该值是否对应于我的 if 语句中的某些内容:

我正在做的和认为的不是最好的方法:

if(isset($_GET['myvar']) && $_GET['myvar'] == 'something'): 做一点事

我的问题是,是否有任何方法可以在不声明变量两次的情况下做到这一点?

这是一个简单的案例,但想象一下必须比较其中的许多$myvar变量。

4

13 回答 13

19

可悲的是,这是唯一的方法。但是有一些方法可以处理更大的数组。例如这样的:

$required = array('myvar', 'foo', 'bar', 'baz');
$missing = array_diff($required, array_keys($_GET));

变量 $missing 现在包含所需的值列表,但 $_GET 数组中缺少这些值。您可以使用 $missing 数组向访问者显示一条消息。

或者你可以使用类似的东西:

$required = array('myvar', 'foo', 'bar', 'baz');
$missing = array_diff($required, array_keys($_GET));
foreach($missing as $m ) {
    $_GET[$m] = null;
}

现在每个必需的元素至少有一个默认值。您现在可以使用 if($_GET['myvar'] == 'something') 而不必担心未设置密钥。

更新

清理代码的另一种方法是使用检查值是否已设置的函数。

function getValue($key) {
    if (!isset($_GET[$key])) {
        return false;
    }
    return $_GET[$key];
}

if (getValue('myvar') == 'something') {
    // Do something
}
于 2010-10-24T10:05:16.627 回答
18

从 PHP7 开始,您可以使用Null Coalescing Operator ??来避免双重引用:

$_GET['myvar'] = 'hello';
if (($_GET['myvar'] ?? '') == 'hello') {
    echo "hello!";
}

输出:

hello!

一般来说,表达式

$a ?? $b

相当于

isset($a) ? $a : $b
于 2018-11-24T04:57:28.037 回答
17

如果您正在寻找一个单行来检查您不确定是否已设置的变量的值,则此方法有效:

if ((isset($variable) ? $variable : null) == $value) { }

唯一可能的缺点是,如果您正在测试true/ false-null将被解释为等于false.

于 2016-08-18T17:12:29.487 回答
1

正如 mellowsoon 建议的那样,您可以考虑这种方法:

required = array('myvar' => "defaultValue1", 'foo' => "value2", 'bar' => "value3", 'baz' => "value4");
$missing = array_diff($required, array_keys($_GET));
foreach($missing as $key => $default  ) {
    $_GET[$key] = $default  ;
}

您输入默认值并将未收到的参数设置为默认值:)

于 2011-10-05T13:36:59.800 回答
0

我的问题是,是否有任何方法可以在不声明变量两次的情况下做到这一点?

不,如果不进行两次检查,就无法正确执行此操作。我也讨厌

解决它的一种方法是将所有相关的 GET 变量在一个中心点导入某种数组或对象(大多数 MVC 框架会自动执行此操作)并设置以后需要的所有属性。(而不是跨代码访问请求变量。)

于 2010-10-24T10:02:02.213 回答
0

这类似于接受的答案,但in_array改为使用。我更喜欢empty()在这种情况下使用。我还建议使用PHP 5.4.0 + 中提供的新的速记数组声明。

$allowed = ["something","nothing"];
if(!empty($_GET['myvar']) && in_array($_GET['myvar'],$allowed)){..}

这是一次检查多个值的函数。

$arrKeys = array_keys($_GET);
$allowed = ["something","nothing"];

function checkGet($arrKeys,$allowed) { 
    foreach($arrKeys as $key ) {
        if(in_array($_GET[$key],$allowed)) {
            $values[$key];
        }
    }
    return $values;
}
于 2014-11-11T11:40:52.627 回答
0

我一直使用自己有用的函数exst()来自动声明变量。

例子 -

$element1 = exst($arr["key1"]);
$val2 = exst($_POST["key2"], 'novalue');


/** 
 * Function exst() - Checks if the variable has been set 
 * (copy/paste it in any place of your code)
 * 
 * If the variable is set and not empty returns the variable (no transformation)
 * If the variable is not set or empty, returns the $default value
 *
 * @param  mixed $var
 * @param  mixed $default
 * 
 * @return mixed 
 */

function exst( & $var, $default = "")
{
    $t = "";
    if ( !isset($var)  || !$var ) {
        if (isset($default) && $default != "") $t = $default;
    }
    else  {  
        $t = $var;
    }
    if (is_string($t)) $t = trim($t);
    return $t;
}
于 2013-04-10T12:01:14.093 回答
0

我从玩耍中找到的解决方案是:

if($x=&$_GET["myvar"] == "something")
{
    // do stuff with $x
}
于 2013-12-14T01:36:07.700 回答
0

为什么不为此创建一个函数,将要检查的变量转换为真实变量,例如。

function _FX($name) { 
  if (isset($$name)) return $$name;
  else return null; 
}

那么你做_FX('param') == '123',只是一个想法

于 2011-08-24T01:29:22.947 回答
0
<?php

function myset(&$var,$value=false){
    if(isset($var)):
        return $var == $value ? $value : false;
    endif;
    return false;
}

$array['key'] = 'foo';

var_dump(myset($array['key'],'bar')); //bool(false)

var_dump(myset($array['key'],'foo'));//string(3) "foo"

var_dump(myset($array['baz'],'bar'));//bool(false) 
于 2014-03-14T14:24:57.680 回答
0

感谢 Mellowsoon 和 Pekka,我在这里做了一些研究并得出了这个结论:

  • 在开始使用之前检查每个变量并将其声明为 null(如果是这种情况)(按照建议):
!isset($_GET['myvar']) ?$_GET['myvar'] = 0:0;

*好的,这很简单,但工作正常,您可以在此行之后开始在任何地方使用该变量

  • 使用数组覆盖所有情况:
$myvars = array('var1', 'var2', 'var3');
foreach($myvars 作为 $key)
    !isset($_GET[$key]) ?$_GET[$key] =0:0;

*之后你可以自由使用你的变量(var1、var2、var3 ...等),

PS.:接收 JSON 对象的函数应该更好(或者一个简单的字符串,带有用于爆炸/内爆的分隔符);

...欢迎更好的方法:)


更新:

使用 $_REQUEST 而不是 $_GET,这样可以同时覆盖 $_GET 和 $_POST 变量。

!isset($_REQUEST[$key]) ?$_REQUEST[$key] =0:0;
于 2010-10-24T21:24:12.187 回答
-1

好吧,您可以忍受,if($_GET['myvar'] == 'something')因为该条件假定变量也存在。如果不是,则表达式也将导致false.

我认为在上面的条件语句中这样做是可以的。真的没有伤害。

于 2010-10-24T12:28:05.560 回答
-3

没有官方参考,但是当我尝试这个时它起作用了:

if (isset($_GET['myvar']) == 'something')
于 2014-03-04T21:40:58.263 回答