Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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检查数组是否包含除某些白名单以外的任何键_Php_Arrays_Get_Whitelist - Fatal编程技术网

PHP检查数组是否包含除某些白名单以外的任何键

PHP检查数组是否包含除某些白名单以外的任何键,php,arrays,get,whitelist,Php,Arrays,Get,Whitelist,我想检查全局GET数组的所有键,如果它包含键,则执行一些操作,而不是数组中的一些白名单键 假设当前url为: .../index.php?randomekey1=valueX&randomkey2=valueY&acceptedkey1=valueZ&randomkey3=valueA&acceptedkey2=valueB 为了更好的可视化: 这些GET参数都在全局GET变量中可用,该变量如下所示: $GET = array( "randomekey1

我想检查全局GET数组的所有键,如果它包含键,则执行一些操作,而不是数组中的一些白名单键

假设当前url为:

.../index.php?randomekey1=valueX&randomkey2=valueY&acceptedkey1=valueZ&randomkey3=valueA&acceptedkey2=valueB
为了更好的可视化: 这些GET参数都在全局GET变量中可用,该变量如下所示:

$GET = array(
    "randomekey1" => "valueX",
    "randomkey2" => "valueY",
    "acceptedkey1" => "valueZ",
    "randomkey3" => "valueA",
    "acceptedkey2" => "valueB"
);
我接受并想要释放的钥匙,我也放入了一个数组:

$whitelist = array(
    "acceptedkey1",
    "acceptedkey2",
    "acceptedkey3",
);
现在我想检查$GET是否包含除白名单以外的任何键。因此,在上面的URL示例中,它应该返回“true”,因为$GET数组中有不在白名单中的键

这样一个未知(非白名单)密钥的存在不仅会触发一个true,还请注意它的空性


另一个示例是以下url:

.../index.php?acceptedkey1=valueZ&acceptedkey3=valueB
这应该返回false,因为除了白名单中的键之外,没有找到其他键

不幸的是,我无法找到任何符合这些要求的in_array函数或array_search的修改,因为据我所知,这些函数只寻找特定的东西,而在我的要求中,我也在寻找特定的东西(白名单键),但同时,我必须检查是否存在一些未知的密钥


谢谢。

PHP中的所有内容都不必都是“让我们来查找完全符合我所需的函数”。只需执行一个简单的foreach循环,即可完成所需的任务:

function clear_filter() {
    $whitelist = array( "project", "table_name", "filterDates", );
    foreach ($_GET as $gkey => $gval) {
        if (!in_array($gkey, $whitelist)) {
            return false;
        }
    }
    return true;
}
您还可以更简单地编写它,使用一个foreach循环,如下所示:

function isValid() {
    // Copy the array
    $temp = $_GET;

    // Loop through the array, and remove any whitelisted elements
    foreach ($whitelist as $wkey) {
        unset($temp[$wkey]);
    }
    // If count($temp) > 0, there are non whitelisted entries in the array.
    return count($temp) === 0;
}

似乎要确定数组是否包含白名单中不存在的键。
查找阵列之间差异的一种方法是使用:

array_diff(array$array1,array$array2[,array$…]):array
返回一个数组,该数组包含
array1
中任何其他数组中都不存在的所有条目

因此,它可以用于从URL返回白名单中不存在的所有键:

$extrasExist = !empty( array_diff( array_keys($GET), $whitelist ) );
var_dump($extrasExist);
下面是一个演示:

$get1=array(
“randomekey1”=>“valueX”,
“随机键2”=>“值”,
“acceptedkey1”=>“valueZ”,
“randomkey3”=>“valueA”,
“acceptedkey2”=>“valueB”
);
$get2=数组(
“acceptedkey1”=>“valueZ”,
“acceptedkey2”=>“valueB”
);
$whitelist=数组(
“acceptedkey1”,
“acceptedkey2”,
“acceptedkey3”
);
$extrasExist=!空(array_diff(array_key($get1),$whitelist));
var_dump($extrasExist);
$extrasExist=!空(array_diff(array_key($get2),$whitelist));
var_dump($extrasExist);
布尔(真)
布尔(假)


您可以使用以下功能

$check = checkWhitliest( $_GET, $whitelist ) );
var_dump ($check );
您可以根据需要调用上述函数

function checkWhitliest( $array, $whitelist ) {

    $allKeys = array_keys ( $array); //Get all Keys from the array.
    $diff = array_diff( $allKeys, $whitelist); //Get the values which are not in whitelist.
    if( count ( $diff ) > 0 ) {     //If the count is greater than 0, then there are certain extra kesy in $_GET
        return true;
    }
    return false;

}

您所说的“不仅存在这样一个未知(非白名单)的键应该触发一个true,而且还应该触发它的空性”是什么意思?对不起,这是您尝试过的
array\u key\u exists
函数吗?请记住,如果要签入$GET,它是一个关联数组(key->value),这意味着您需要专门查找该键(在您的情况下)以验证您的白名单规则数组元素是否存在。另请参见或。是否要删除任何未白名单的键(和值)?“PHP中的所有内容都不必全部”让我们找到一个函数,它完全符合我的要求“我知道,这就是为什么我说我没有发现这些函数的合适修改。不管怎样,你的第一个建议对我根本不起作用。无论是否存在非白名单键,它都返回true。第二种方法有点效果,但正好相反。当只找到白名单时,它给我一个1,如果也找到了非白名单,它什么也不给。我可以和第二个一起工作。谢谢。@DanielM我意外地将
if($wkey!=$wkey)
放入的第一个函数,它破坏了该函数。不过,这两个函数都将比
数组_diff
有效得多,因为您不需要分配更多的数组。如果您关心性能,我强烈建议您使用上述解决方案之一。无法使其正常工作。它一直在给我假消息<代码>函数clear_filter(){$whitelist=array(“project”、“table_name”、“filterDates”);foreach($\u GET as$gkey=>$gval){foreach($wkey作为$wkey的白名单){if($gkey!=$wkey){return false';}}}}return true';}echo clear_filter()@DanielM查看我更新的第一个函数。在执行
var_dump()
时,我意识到它正在比较每个键,一旦第一个键不匹配,它就会返回。除非
$whitelist
$array
正好是一个项目,否则这确实总是失败的。现在,在数组()中使用
可以解决此问题。同时避免返回
'true'
'false'
字符串。如果要查看布尔结果,请使用
var\u dump(clear\u filter())
@DanielM bare,记住这种方法是次优的。对于小型阵列来说,这可能不是什么大问题。但是如果你有大的数组,那么当你发现第一个不在白名单上的项目时就结束检查会更明智。建议的方法将遍历整个数组,即使它不是必需的…您只需编写
返回计数($diff)>0