PHP - array_diff_key()返回重复值而不是键的结果?

时间:2017-04-03 15:36:43

标签: php

我使用此函数来检查预期的请求变量。它工作得很好,直到我意识到如果两个值(非键)相同,它将返回一个正数,就好像一个键丢失了。请考虑以下代码:

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'和密码'两者都保持相同的值,它将运行returnError()。没看到原因。

这里是$ _POST的转储:

array (
  'poolName' => 'xpool',
  'userPrefix' => 'xpool'
)

1 个答案:

答案 0 :(得分:1)

array_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']);