从多维$ _GET数组中获取已知键

时间:2016-03-27 19:11:11

标签: php arrays multidimensional-array get

我想创建一个可以从$ _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数组是多维的,可以设置也可以不设置。

1 个答案:

答案 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