如何将PHP $ _POST数组作为可用作名称属性的字符串返回?

时间:2015-12-04 20:42:56

标签: php arrays forms tail-recursion postdata

问题:

我有一系列的帖子值如下:

$_POST['children'] = array(
[0]=>array(
'fname' => 'name',
'mname' => 'mname',
'lname' => 'lname,
'dob' => '10/17/1992
),
[1]=>array(
'fname' => 'name',
'mname' => 'mname',
'lname' => 'lname,
'dob' => '10/17/1992
),
[2]=>array(
'fname' => 'name',
'mname' => 'mname',
'lname' => 'lname,
'dob' => '10/17/1992
)
);
// and so on

我的视图函数中设置了一个脚本,用于检查旧输入,并在表单未验证的情况下重新填充值。我需要找到一种方法将上面的数组作为一系列键/值对返回,即

'children[0][fname]' = 'name'
'children[0][mname]' = 'mname'
'children[0][lname]' = 'lname'
// ... and so on for all fields

理想情况下,我希望这可以使用任何深度的数组,这让我觉得我需要某种递归函数来格式化键。我正在艰难地探讨如何做到这一点。

我尝试了什么

我一直在使用以下功能:

function flatten($post_data, $prefix = '') {
    $result = array();
    foreach($post_data as $key => $value) {
        if(is_array($value)) {
            if($prefix == ''){
                $result = $result + flatten($value, $prefix. $key );    
            }else{
                $result = $result + flatten($value, $prefix. '[' . $key . ']'); 
            }

        }
        else {
            $result[$prefix . $key .''] = $value;
        }

    }
    return $result;
}

这让我有点接近,但不太对劲。当我输入我的$ _POST数组

时,它返回以下内容
[children[1]fname] => test
[children[1]mname] => test
[children[1]lname] => test
[children[1]dob] => 
// Expecting: children[1][fname] => test
// ...

或者是否有更简单的方法来实现这一目标?

1 个答案:

答案 0 :(得分:0)

最终为我工作的是什么:

function flatten($post_data, $prefix = '') {
    $result = array();
    foreach($post_data as $key => $value) {
        if(is_array($value)) {
            if($prefix == ''){
                $result = $result + flatten($value, $prefix. $key );    
            }else{
                $result = $result + flatten($value, $prefix. '[' . $key . ']'); 
            }

        }
        else {
            if( $prefix == ''){
                $result[$prefix . $key.''] = $value;
            }else{
                $result[$prefix . '['.$key.']'.''] = $value;
            } 

        }

    }
    return $result;
}

它没有考虑递归函数的最后一次调用的返回值是标量值。添加这些if / else语句似乎已经解决了它。

if( $prefix == ''){
    $result[$prefix . $key.''] = $value;
}else{
    $result[$prefix . '['.$key.']'.''] = $value;
}