PHP:检查变量是否存在,以及是否有等于某个值的值
我有(或没有)一个来自查询字符串的变量PHP:检查变量是否存在,以及是否有等于某个值的值,php,variables,if-statement,isset,Php,Variables,If Statement,Isset,我有(或没有)一个来自查询字符串的变量$\u GET['myvar'],我想检查该变量是否存在,以及该值是否对应于if语句中的某个内容: 我正在做和思考的并不是最好的方式: if(设置($\u GET['myvar'])&&&$\u GET['myvar']=='something'):做点什么 我的问题是,有没有办法不用两次声明变量就可以做到这一点 这是一个简单的例子,但想象一下,我们必须比较许多$myvar变量 !isset($_REQUEST[$key]) ? $_REQUEST[$key
$\u GET['myvar']
,我想检查该变量是否存在,以及该值是否对应于if语句中的某个内容:
我正在做和思考的并不是最好的方式:
if(设置($\u GET['myvar'])&&&$\u GET['myvar']=='something')
:做点什么
我的问题是,有没有办法不用两次声明变量就可以做到这一点
这是一个简单的例子,但想象一下,我们必须比较许多$myvar
变量
!isset($_REQUEST[$key]) ? $_REQUEST[$key] =0:0;
我的问题是,有没有办法不用两次声明变量就可以做到这一点
不,如果不进行两次检查,就无法正确执行此操作
解决这个问题的一种方法是在一个中心点将所有相关的GET变量导入某种数组或对象(大多数MVC框架会自动这样做)并设置以后需要的所有属性。(而不是通过代码访问请求变量。)遗憾的是,这是唯一的方法。但是有一些方法可以处理较大的阵列。例如这样的事情:
$required = array('myvar', 'foo', 'bar', 'baz');
$missing = array_diff($required, array_keys($_GET));
变量$missing现在包含所需的值列表,但是$\u GET数组中缺少这些值。您可以使用$missing数组向访问者显示消息
或者你可以使用类似的东西:
$required = array('myvar', 'foo', 'bar', 'baz');
$missing = array_diff($required, array_keys($_GET));
foreach($missing as $m ) {
$_GET[$m] = null;
}
现在,每个必需元素至少有一个默认值。您现在可以使用if($\u GET['myvar']=='something'),而不用担心键没有设置
更新
清理代码的另一种方法是使用一个函数来检查是否设置了值
function getValue($key) {
if (!isset($_GET[$key])) {
return false;
}
return $_GET[$key];
}
if (getValue('myvar') == 'something') {
// Do something
}
嗯,如果($\u get['myvar']='something')这个条件假设变量也存在,那么您就可以通过
了。否则,表达式也将导致false
我认为在上面的条件语句中这样做是可以的。真的没有造成伤害。谢谢梅卢森和佩卡,我在这里做了一些研究,得出了以下结论:
- 在开始使用(根据建议)之前,检查每个变量并将其声明为null(如果是):
!isset($_GET['myvar'])$_获取['myvar']=0:0;
*好的,这个很简单,但是很好用,你可以开始在这行后面的任何地方使用这个变量
- 使用数组覆盖所有情况:
$myvars=数组('var1','var2','var3');
foreach($myvars作为$key)
!isset($\u GET[$key])$_获取[$key]=0:0;
*之后,您可以自由使用变量(var1、var2、var3…等等)
PS:接收JSON对象的函数应该更好(或者一个带分隔符的简单字符串,用于分解/内爆)
。。。欢迎采用更好的方法:)
更新:
使用$\u-REQUEST而不是$\u-GET,这样可以同时包含$\u-GET和$\u-POST变量
!isset($_REQUEST[$key]) ? $_REQUEST[$key] =0:0;
!isset($\u请求[$key])$_请求[$key]=0:0;
为什么不创建一个函数来执行此操作,将您要检查的变量转换为实变量,例如
function _FX($name) {
if (isset($$name)) return $$name;
else return null;
}
那么你就做了 > fx(‘PARAM’)=‘123’< /COD>,只是一个想法
< P>正如MyLoWoMy建议的,你可以考虑这个方法:
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 ;
}
您输入默认值,并将未接收的参数设置为默认值:)我使用所有时间自己的有用函数exst(),该函数自动声明变量
!isset($_REQUEST[$key]) ? $_REQUEST[$key] =0:0;
范例-
$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;
}
我在游戏中发现的一个解决方案是:
if($x=&$_GET["myvar"] == "something")
{
// do stuff with $x
}
没有官方参考,但在我尝试以下方法时,它起了作用:
if (isset($_GET['myvar']) == 'something')
这与公认的答案类似,但在数组中使用
。在这种情况下,我更喜欢使用empty()
。我还建议使用新的速记数组声明,该声明在+
下面是一个用于同时检查多个值的函数
$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;
}
如果您正在寻找一个单行程序来检查一个变量的值,但您不确定该变量是否已设置,则此操作有效:
if ((isset($variable) ? $variable : null) == $value) { }
唯一可能的缺点是,如果您正在测试true
/false
-null
将被解释为等于false
从PHP7开始,您可以使用??
来避免双重引用:
$_GET['myvar'] = 'hello';
if (($_GET['myvar'] ?? '') == 'hello') {
echo "hello!";
}
输出:
hello!
一般来说
$a ?? $b
相当于
isset($a) ? $a : $b
只需定义所有变量。这就是所有这些乱七八糟的问题所在。谢谢你,佩卡,这样做真的很无聊。有时候在一个大系统中很难预测变量何时会出现,这就是为什么声明变量可能没有帮助。但是你在大多数情况下都是对的。@Mariz我不同意:预测变量何时出现应该从来都不难:如果是这样,你的代码就不好。Pekka这是“理想的”,但在一个匆忙的世界里,来自不同背景的人在同一个项目中工作,这很难做到。无论如何,Thancing people.PHP对此没有解决方案,但它是一种编程语言。您可以(而且应该)总是编写一个子程序来缩短重复代码。更不用说,在一个好的程序中,每个变量都应该在使用前定义好……我在那里看到了这一点,只是希望不使用数组也能实现,谢谢。更新了我的答案,展示了一种不使用另一个数组就可以实现这一点的方法。请向上投票下面提到($var???'value')
的答案。多亏了PHP7,这是现在最简洁的方法。如果myvar索引不存在,它会触发一个通知。是的,但您只是在测试该索引。我想,如果那个条款根本不存在的话,情况只会非常糟糕。我可以接受的通知。毕竟,这只是一个通知,根据定义,它是无害的(通常)。哦,我完全不同意。如果您的目标是创建一个草率的PHP代码库,其中充满了鬼鬼祟祟/无声的bug,那么忽略通知将是一个很好的开始。您应该始终在打开通知的情况下进行开发,并且应该始终将它们视为要修复的bug。不幸的是,如果数组键不存在,则会触发PHP通知,不是吗?不。这是
$a ?? $b
isset($a) ? $a : $b