Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-array_diff_key()返回重复值而不是键的结果?_Php - Fatal编程技术网

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()将修复它。