我想创建一个可以从$ _GET数组(或$ _POST或$ _COOKIE数组)中获取任何键的函数(或方法)。 $ _GET数组可以是平面的,不存在的或多维的。密钥是关联的,它们可能并不总是存在 - 就像提交空表格时一样 - >在网址中没有设置$ _GET参数。
以下是我要支持的方案的示例网址:http://www.example.com/foo?foo[name]=John&foo[color][]=red&foo[color][]=green&foo[color][]=yellow&foo[gender]=male
。
此网址的内容应由相同的get()函数捕获:
get($foo[name]) // Return value set in input field.
get($foo[color]) // Return array with none/one/many values (set in checkbox or multi-select, see sample code below).
// The functions shall be similar to:
$_GET['foo']['name'] // string
$_GET['foo']['color'] // array
我将使用该功能的主要用例是在提交表单时,例如下面的表单。提交表单时,我想从复选框和单选按钮中获取数据天气设置与否。
<form method="GET">
<input type="text" name="foo[name]" value="">
<input type="radio" name="foo[gender]" value="male">
<input type="radio" name="foo[gender]" value="female">
</form>
表单的示例输出到此处。
示例1:过帐表单并设置了所有字段:
Array (
[foo] => Array (
[name] => John
[color] => Array (
[0] => red
[1] => green
[2] => yellow
)
[gender] => male
)
)
示例2:表单提交为空(因此不存在任何键,重要的是该函数支持此方案):
Array ()
我尝试的事情:
具有平面或不存在阵列的前两个场景易于管理,如下面的功能所示,它将处理平面和不存在的阵列键。但是,该函数不支持多维数组(例如,最多有两个维度级别)。
// This will only work for a form that returns a flat $_GET array (e.g., http://www.example.com/foo?a=1&c=3).
// `get('foo[color]')` will not do the trick.
function get($key) {
if (isset($_GET[$key])) {
return $_GET[$key];
}
}
我的问题是我如何构建一个类似的功能也支持多维数组的场景?如何创建函数以使其对多维数组有效?
谢谢..: - )
PS:如果您的答案涉及RecursiveArrayIterator()之类的内容,我将非常感谢您提供一个完整的示例,因为这可能具有挑战性。
PPS:对于快速使用重复按钮的审阅者:我知道StackOverflow对$ _GET和数组有很多疑问,因此鼓励我的审阅者在将其标记为重复之前阅读并重新阅读该问题。同样,这里的场景是如何创建一个支持从$ _GET数组中获取已知键的函数,$ _GET数组是多维的,可以设置也可以不设置。
答案 0 :(得分:1)
我有一种感觉,这是一种更聪明的方式;也许我误解了这个问题。
<?php
$_GET = ['foo'=>[ // just for this example, don't fiddle with _GET like this in production code....
'name'=>'John',
'colors'=>[
'primary'=>['red','green','yellow'],
'secondary'=>['white','purple']
],
'gender'=>'male'
]];
echo '1 ', get('foo', 'name'), "\r\n";
echo '2 ', var_export( get('foo', 'color'), true ), "\r\n";
echo '3 ', var_export( get('foo', 'colors'), true ), "\r\n";
echo '4 ', get('foo', 'colors', 'primary', 0), "\r\n";
echo '5 ', get('foo', 'colors', 'secondary', 1), "\r\n";
echo '6 ', get('foo', 'gender'), "\r\n";
// see http://docs.php.net//functions.arguments#functions.variable-arg-list
function get(...$keys) {
$cur = $_GET;
foreach( $keys as $k ) {
if ( !isset($cur[$k]) ) {
return FALSE;
}
else {
$cur = $cur[$k];
}
}
return $cur;
}
打印
1 John
2 false
3 array (
'primary' =>
array (
0 => 'red',
1 => 'green',
2 => 'yellow',
),
'secondary' =>
array (
0 => 'white',
1 => 'purple',
),
)
4 red
5 purple
6 male