PHP检查数组是否包含除某些白名单以外的任何键
我想检查全局GET数组的所有键,如果它包含键,则执行一些操作,而不是数组中的一些白名单键 假设当前url为: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
.../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代码>