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

Can't recursively normalize widget[name][]

考虑这个简单的形式:

<?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
            )
        )
)

所以,我一直在尝试实现一种算法,该算法会递归地变成这样,但我失败了很多次。 所以我放弃了,需要你们从不同的角度看待这个问题。有什么想法吗?

能不能改一下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 个键,则不需要。

首先我们提取键,并将它们作为键放在每个子数组中。然后我们用原始数组中那个位置上那个键的值填充它们,例如widget[names][0]