我有(或没有)变量$_GET['myvar']
来自我的查询字符串,我想检查这个变量是否存在,以及该值是否与if语句中的内容相对应:
我正在做和想的不是最好的方法:
if(isset($_GET['myvar']) && $_GET['myvar'] == 'something')
:做点什么
我的问题是,在没有声明变量两次的情况下,有没有办法做到这一点?
这是一个简单的案例,但想象一下必须比较许多$myvar
个变量。
答案 0 :(得分:17)
可悲的是,这是唯一的方法。但是有一些方法可以处理更大的数组。比如像这样:
$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
}
答案 1 :(得分:12)
如果您正在寻找单行代码以检查您尚未确定的变量的值,则可行:
if ((isset($variable) ? $variable : null) == $value) { }
唯一可能的缺点是,如果您对true
/ false
进行测试 - null
将被解释为等于false
。
答案 2 :(得分:2)
从PHP7开始,您可以使用Null Coalescing Operator ??
来避免重复引用:
$_GET['myvar'] = 'hello';
if (($_GET['myvar'] ?? '') == 'hello') {
echo "hello!";
}
输出:
hello!
通常,表达式
$a ?? $b
等同于
isset($a) ? $a : $b
答案 3 :(得分: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 ;
}
您输入默认值并将未接收的参数设置为默认值:)
答案 4 :(得分:0)
我的问题是,在没有声明变量两次的情况下,有没有办法做到这一点?
不,如果不进行两次检查,就无法正确执行此操作。 I hate it, too.
解决这个问题的一种方法是将一个中心点的所有相关GET变量导入某种数组或对象(大多数MVC框架自动执行此操作)并设置稍后需要的所有属性。 (而不是跨代码访问请求变量。)
答案 5 :(得分:0)
感谢Mellowsoon和Pekka,我在这里做了一些研究并提出了这个问题:
!isset($_GET['myvar']) ? $_GET['myvar'] = 0:0;
*确定这个很简单,但工作正常,你可以在这一行之后的任何地方开始使用变量
$myvars = array( 'var1', 'var2', 'var3'); foreach($myvars as $key) !isset($_GET[$key]) ? $_GET[$key] =0:0;
*之后您可以自由使用变量(var1,var2,var3 ......等),
PS:接收JSON对象的函数应该更好(或者是带有分隔符的爆炸/内爆的简单字符串);
......欢迎更好的方法:)
<强>更新强>
使用$ _REQUEST而不是$ _GET,这样就可以覆盖$ _GET和$ _POST变量。
!isset($_REQUEST[$key]) ? $_REQUEST[$key] =0:0;
答案 6 :(得分:0)
为什么不创建一个执行此操作的函数,将要检查的变量转换为实数变量,例如。
function _FX($name) {
if (isset($$name)) return $$name;
else return null;
}
然后你做_FX('param') == '123'
,只是一个想法
答案 7 :(得分: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;
}
答案 8 :(得分:0)
我在游戏中找到的解决方案是:
if($x=&$_GET["myvar"] == "something")
{
// do stuff with $x
}
答案 9 :(得分: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)
答案 10 :(得分: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;
}
答案 11 :(得分:-1)
嗯,你可以只用if($_GET['myvar'] == 'something')
,因为那个条件假定变量也存在。如果没有,表达式也会产生false
。
我认为在上述条件语句中执行此操作是可以的。没有伤害。
答案 12 :(得分:-3)
没有官方参考,但是当我尝试这个时它起作用了:
if (isset($_GET['myvar']) == 'something')