无法递归规范化widget [name] []

时间:2015-02-03 12:21:16

标签: php recursion

考虑这个简单的形式:

<?php

if (!empty($_GET)) {
    echo '<pre>', print_r($_GET, true), '</pre>';
}

?>

<form>

    <input type="text" name="widget[name][]" />
    <input type="text" name="widget[version][]" />


    <input type="text" name="widget[name][]" />
    <input type="text" name="widget[version][]" />

    <br />

    <button type="submit">Submit</button>

</form>

发送数据时,它提供以下输出:

(我分别输入了虚拟值name1,name2和version1,version2)

Array
(
    [widget] => Array
        (
            [name] => Array
                (
                    [0] => name1
                    [1] => name2
                )

            [version] => Array
                (
                    [0] => version1
                    [1] => version2
                )

        )

)

我真正想做的是把它变成这个:

Array
(
    [widget] => Array
        (
            [0] => Array(
                [name] => name1,
                [version] => version1
            ),

            [1] => Array(
                [name] => name2,
                [version] => version2
            )
        )
)

所以,我一直试图实现一种递归转换为算法的算法,但我已经多次失败了。 所以我放弃了,需要你们从不同角度看待这个问题。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您无法更改HTML,它是不正确的吗?

<form>

    <input type="text" name="widget[0][name]" />
    <input type="text" name="widget[0][version]" />


    <input type="text" name="widget[1][name]" />
    <input type="text" name="widget[1][version]" />

    <br />

    <button type="submit">Submit</button>

</form>

如果它是从PHP循环自动生成的,你仍然可以操作计数器(0,1 ...);

对于代码转换,我已经知道模式是什么:

<?php

if (!empty($_GET)) { 
    $widget = $_GET['widget'];
    $output = [];
    $i = 0;
    $keys = array_keys($widget);
    foreach ($widget as $value) {
        $output[$i] = [
            $keys[0] => $widget[$keys[0]][$i],
            $keys[1] => $widget[$keys[1]][$i]
        ];
        $i++;
    }

    echo '<pre>', print_r($output, true), '</pre>';
}

?>

输出结果为:

Array
(
    [0] => Array
        (
            [name] => name1
            [version] => version1
        )

    [1] => Array
        (
            [name] => name2
            [version] => version2
        )

)

如果你有任意数量的键(名称,版本,bla,blabla等等),那将会更难,但并非不可能,那么你可以遍历键,但在那个例子中我假设如果只有2个键,那就不需要了。

首先,我们提取密钥,并将它们作为密钥放在每个子数组中。然后我们用原始数组E.g中该键的值填充它们。与widget[names][0]