如何将数组键转换为$ _POST [name]

时间:2014-01-27 12:57:48

标签: php arrays post

如果a的表单输入的名称如“name [0] [firstname]”,$ _POST将检索为:

 'name' => 
    array (size=1)
      0 => 
        array (size=9)
          'firstname' => null

所以echo $_POST['name'][0]['firstname']会给我null。

问题是我如何从数组键动态构建帖子查询?所以,例如:

$foo = array('name', 0, 'firstname'); 
echo $_POST[$foo];  // obviously doesn't work 

我需要做的是从数组中构建此语句$_POST['name'][0]['firstname'],但无法找到方法。我想也许$_POST{'[' . implode('][',$foo) . ']'}可能有效,但我得到未定义的索引:['name'][0]['firstname']

最终解决方案**

关于@Alireza和@Matteo的解决方案,两者都有效,除非数组长于$ _POST数组,例如,如果数组是$ foo = array('name',0,' firstname','lastname')和post值是array ['name'] [0] ['firstname'] =“XXX”,结果将是“X”,它是结果XXX的索引0。因此,它需要检查帖子的键而不是值。

因此,我的最终解决方案是:

function getValue($res, $foo)
{
    foreach ($foo as $val) {
        if (is_array($res) && array_key_exists($val, $res)) {
            $res = $res[$val];
        } else {
            return false;
        }
    }
    return $res;
}

示例:

$post = array(
  'name' => array(
    0 => array(
      'firstname' => 'XXX'
    ),
  )
);

echo getValue($post, array('name', 0, 'firstname'));
> XXX    
echo getValue($post, array('name', 0, 'firstname', 'lastname'));
> false
echo getValue($post, array('name', 0, 'firstname', 0));
> false
echo getValue($post, array('name', 0, 0));
> false  
echo getValue($post, array('name', 0));
> Array (eg, Array ( [firstname] => XXX )) - expected 

感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

如果适用于您的话,请试试这个:

function getArrayValue($basearray,$name){
    $args = func_get_args();
    $argc = func_num_args();
    $base = isset($basearray[$name])
        ? $basearray[$name]
        : null;
    if($argc > 2 && is_array($base)){
        for($i=2; $i < $argc; $i++){
            $base = getArrayValue($base,$args[$i]);
        }
    }
    return $base;
}

$myname = getArrayValue($_POST,0,'firstname');

答案 1 :(得分:1)

我认为非常更容易:

$foo = array('name', 0, 'firstname')
$res = $_POST;
foreach ($foo as $val) {
    $res = $res[$val];
}
echo $res;

示例:

$array[0]['f']['p'][8]['Hi'] = 'Hello World!';
$foo = array(0,'f','p',8,'Hi');
$res = $array;
foreach ($foo as $val) {
    $res = $res[$val];
}
echo $res;

回应'Hello World!'

答案 2 :(得分:1)

首先,下一行中只应有一个右括号:

$foo = array('name', 0, 'firstname');

其次,如果要使用$foo的值作为键创建多维数组,则需要递归函数:

function create_multidimensional_array(&$arr, $keys, $val){
    if($keys === array()){
    $arr = $val;
    }
    else{
    $key = array_shift($keys);
    $arr[$key] = array();
    create_multidimensional_array($arr[$key], $keys, $val);
    }
}

$foo = array('name', 0, 'firstname');
create_multidimensional_array($_POST, $foo, "Charles");
print_r($_POST);

输出将是:

Array
(
    [name] => Array
        (
            [0] => Array
                (
                    [firstname] => Charles
                )

        )

)

答案 3 :(得分:0)

试试这个:

function getValue($array, $key) {
    $val = NULL;

    foreach((array) $key as $k) {
        $val = @$array[$k];
        $array = @$array[$k];
    }

    return $val;
}

所以,例如

$array = array(
  'name' => array(
    0 => array(
      'firstname' => 'XXX'
    ),
  )
);

然后getValue($array, 'name') == array(0 => array('firstname' => 'XXX'))getValue($array, array('name', 0, 'firstname')) == 'XXX'

有关实例,请参阅http://sandbox.onlinephpfunctions.com/code/0780e1165ee9851f33fb1e019717ab32cd527d51