Php 将多维数组的路径表示为字符串(例如表单输入名称数组)

Php 将多维数组的路径表示为字符串(例如表单输入名称数组),php,arrays,forms,input,multidimensional-array,Php,Arrays,Forms,Input,Multidimensional Array,假设有使用数组样式名称发布的表单输入: <input type="text" name="user[name]" value="John" /> <input type="text" name="user[email]" value="foo@example.org" /> <input type="checkbox" name="user[prefs][]" value="1" checked="checked" /> <input type="che

假设有使用数组样式名称发布的表单输入:

<input type="text" name="user[name]" value="John" />
<input type="text" name="user[email]" value="foo@example.org" />
<input type="checkbox" name="user[prefs][]" value="1" checked="checked" />
<input type="checkbox" name="user[prefs][]" value="2" checked="checked" />
<input type="text" name="other[example][var]" value="foo" />
目标是能够调用函数,如下所示:

$form_values = form_values($_POST);
这将返回一个关联数组,其中的键与原始输入名称的样式相似:

Array
(
    [user[name]] => John
    [user[email]] => foo@example.org
    [user[prefs][]] => Array
        (
            [0] => 1
            [1] => 2
        )

    [other[example][var]] => foo
)

这是一个非常具有挑战性的问题,此时我的“车轮在泥浆中打转”。:-[

我不知道为什么需要这样做,但如果下面的代码可以给您一个提示:

$testArray = array ( 'user' => array ( 'name' => 'John', 'email' => 'test@example.org', 'prefs' => array ( 0 => '1', ), ), 'other' => array ( 'example' => array ( 'var' => 'foo', ), ), );

function toPlain($in,$track=null)
{
    $ret = array();
    foreach ($in as $k => $v) {
        $encappedKey = $track ? "[$k]" : $k; /* If it's a root */

        if (is_array($v)) {
            $ret = array_merge($ret,toPlain($v,$track.$encappedKey));
        } else {
            $ret = array_merge($ret,array($track.$encappedKey => $v));
        }
    }
    return $ret;
}
print_r(toPlain($testArray));

如果你想测试的话,我尝试了自己疯狂的方法

<?php
function buildArray($input, &$output, $inputkey='')
{
    foreach($input as $key => $value)
    {
        if(is_array($value))
        {
            if($inputkey != "")
            {
                $inputkey .= "[$key]";
                buildArray($value, $output, $inputkey);
            }
            else
            {
                buildArray($value, $output, $key);
            }

        }
        else
        {
             $output[$inputkey."[$key]"] = $value;
        }
    }
 }

 $output = array();
 $input = array("user"=>array("name"=>"John","Email"=>"test.com","prefs"=>array(1,2)), "other"=>array("example"=>array("var"=>"foo")));
 buildArray($input, $output);
 print_r($output);
?>


我不知道大多数内置PHP函数的功能,因为我还没有学习它们,所以我想出了自己的递归方法。

如果你做了
$user=$\u POST['user'];
,你可以通过
$user['name']访问用户名
,我不知道为什么要将数组括号嵌入密钥中,因为这样会以更易访问和更有意义的方式分解已经保存数据的数据结构。这是因为我一直在开发一个表单类,它可以输出一个文本框,比如说
。我认为,通过这种方式提取密钥检查文本框的默认值很简单。有意义吗?
'user[email]
将是
$form\u values
示例中的一个键,并保存提交的值。Hmm.可以随时更改输入命令,将数组改为“name”。例如,
$form->input(数组('type'=>'text',name'=>array('user',name')))
这样你就可以访问
$\u POST[$array[0][$array[1]]]]
这也不是一个坏主意,很好,但我有点喜欢让
$form->input()
方法接受HTML输出中出现的参数……干得好!我想这样就可以了……这里是对“user[prefs][]的一点修改“这个案子有点“被抓住了”通过它附加数字元素…它检查每个序列的数字数组。此函数的原因在原始帖子的注释中描述。谢谢!如果您有机会阅读第一篇帖子中的推理,我为什么要像这样重新创建数组,这有意义吗?太好了,谢谢!您的函数看起来很有用ce所需的输出..我使用了第一个答案…我倾向于返回数组,而不是接受和修改对
$output
。。。
<?php
function buildArray($input, &$output, $inputkey='')
{
    foreach($input as $key => $value)
    {
        if(is_array($value))
        {
            if($inputkey != "")
            {
                $inputkey .= "[$key]";
                buildArray($value, $output, $inputkey);
            }
            else
            {
                buildArray($value, $output, $key);
            }

        }
        else
        {
             $output[$inputkey."[$key]"] = $value;
        }
    }
 }

 $output = array();
 $input = array("user"=>array("name"=>"John","Email"=>"test.com","prefs"=>array(1,2)), "other"=>array("example"=>array("var"=>"foo")));
 buildArray($input, $output);
 print_r($output);
?>