PHP-array_diff_key()返回重复值而不是键的结果?
我使用这个函数来检查预期的请求变量。它工作得很好,直到我意识到如果两个值(不是键)相同,它将返回一个正数,就好像缺少一个键一样。考虑下面的代码:PHP-array_diff_key()返回重复值而不是键的结果?,php,Php,我使用这个函数来检查预期的请求变量。它工作得很好,直到我意识到如果两个值(不是键)相同,它将返回一个正数,就好像缺少一个键一样。考虑下面的代码: function requestCheck($expectedAr) { if(isset($_GET) && isset($_POST)) { $requestAr = array_unique(array_merge($_GET, $_POST)); }elseif(isset($_GET))
function requestCheck($expectedAr)
{
if(isset($_GET) && isset($_POST))
{
$requestAr = array_unique(array_merge($_GET, $_POST));
}elseif(isset($_GET)){
$requestAr = $_GET;
}elseif(isset($_POST)){
$requestAr = $_POST;
}else{
$requestAr = array();
}
$diffAr = array_diff_key(array_flip($expectedAr),$requestAr);
if(count($diffAr) > 0)
{
returnError("Missing variables: ".implode(',',array_flip($diffAr)).".");
}else {
return $requestAr;
}
}
$requestAr = requestCheck(['name','password']);
如果“name”和“password”都具有相同的值,它将运行returnError()。不明白为什么
这里有一个$u帖子的转储:
array (
'poolName' => 'xpool',
'userPrefix' => 'xpool'
)
array\u unique
将删除唯一值,因此您可以使用名称或密码,但不能同时使用两者
解决方案:
function requestCheck($expectedAr) {
if(isset($_GET) && isset($_POST)) {
$requestAr = $_REQUEST;
}elseif(isset($_GET)) {
$requestAr = $_GET;
}elseif(isset($_POST)) {
$requestAr = $_POST;
}else{
$requestAr = array();
}
$diffAr = array_diff_key(array_flip($expectedAr),$requestAr);
if(count($diffAr) > 0)
{
returnError("Missing variables: ".implode(',',array_flip($diffAr)).".");
}else {
return $requestAr;
}
}
$requestAr = requestCheck(['name','password']);
我认为还可以安全地执行以下操作:
function requestCheck($expectedAr) {
$requestAr = isset($_REQUEST) && is_array($_REQUEST)?$_REQUEST:array();
$diffAr = array_diff_key(array_flip($expectedAr),$requestAr);
if(count($diffAr) > 0) {
returnError("Missing variables: ".implode(',',array_flip($diffAr)).".");
}else {
return $requestAr;
}
}
$requestAr = requestCheck(['name','password']);
您可以使用
var\u export
添加一些示例输入数组以转储它们吗?添加了输入array@xendi默认情况下,键是唯一的。你不能多次使用同一个密钥创建数组。好吧,我将post和get组合在一起,以防有人错误地通过这两种方式发送,无论如何我都可以接受。出于某种原因,我被告知不要使用请求。我认为,因为它包含的不仅仅是get和post。我以前在使用请求时遇到错误。可能有一些保留字。@xendi与组合2差不多(不过其中也包含cookies)。是的,我认为是会话变量发生冲突,导致错误,导致我停止使用请求。array\u intersect\u key()将修复它。