一次循环通过$_GET和$_POST


Loop through $_GET and $_POST in one go?

是否有一种方法可以一次动态访问$_GET$_POST ?IE,比如:

$do = array('GET', 'POST');
foreach($do AS $type) {
    foreach (${'_'.type} AS $var=>$val) {
         ... # logic
    }
}

我知道有$_REQUEST,但这并没有告诉我来源(获取或发布),并且有弃用的HTTP_GET_VARSHTTP_POST_VARS,但那些是弃用的。

显然,我可以单独循环。我尽量避免这样做的原因是,逻辑有点长,但也是一样的。理想的情况是不需要有这个逻辑的副本,让自己容易出错。

或者我完全认为这是错误的方式,有一些其他推荐的方法?

谢谢!


谢谢你

谢谢大家的反馈。我认为@ decze最客观地回答了这个问题,但是@charlee(以及后来的decze)暗示了一个更好的解决方案。

最后,我创建了一个带有逻辑的函数,然后将其放在foreach中,如下所示:
foreach($_GET AS $var => $val) {
    $_GET[$var] = func($val);
}

我最终使用了两个foreach(),但我很欣赏它的可读性和增强的可用性。再次感谢大家!

foreach (array('get' => $_GET, 'post' => $_POST) as $type => $values) {
    foreach ($values as $key => $value) {
        ...
    }
}

如果您确实关心源,我建议您单独循环。$_POST和$_GET混在一起是不安全的,因为黑客更容易通过GET传递数据,而GET应该是POST。

长逻辑总是可以提取到一个函数中,所以你不会有这个逻辑的副本。

将您的数组与array_merge()合并:

$_GET  = array('one' => 'foo', 'two' => 'bar');
$_POST = array('three' => 'foo', 'four' => 'bar');
$merged = array('_GET' => $_GET, '_POST' => $_POST);
foreach($merged AS $type => $array) {
    foreach ($array AS $var => $val) {
        echo "[{$type}] {$var}: {$val}" . PHP_EOL;
    }
}

输出
[_GET] one: foo
[_GET] two: bar
[_POST] three: foo
[_POST] four: bar

是的,你不应该使用$_REQUEST,因为

它结合了COOKIE以及GET和POST,并且COOKIE数据总是优先,从而可能产生危险的"粘性"变量。

如果逻辑相同,您可以尝试使用函数。将整个代码放入函数中,并传递想要循环的数组,即$_GET或$_POST。如果您想知道它是GET还是POST的来源,您可以尝试连接。