PHP 修改多维数组以更新值而不是添加到末尾

PHP Modify multidimensional array to update values rather than adding to the end

我需要帮助来修改数组以达到所需的结构。很抱歉示例结构可能很大,但我想更好地展示结构。

我有一个像下面这样的目标数组,我需要生成它

[bf_1040242] => Array
                (
                    [326] => Just some Information.  Additional Text
                    [17565] => Array
                        (
                            [0] => 2
                            [1] => 1
                            [2] => 3
                        )

                    [other] => Array
                        (
                            [17565] => Testing
                            [28623] => 
                            [42284] => Something Else
                        )

                    [597] => 1
                    [327] => This is some text
                    [328] => asdasd
                    [11880] => wwwww
                    [329] => xxxxx
                    [28622] => 2
                    [42283] => 1
                    [42284] => Array
                        (
                            [0] => 2
                            [1] => 3
                            [2] => 4
                        )

我生成此数据的格式不同,其中这些值的结构为字符串。

Array
(
    [0] => Array
        (
            [name] => bf_1040242[326]
            [value] => Just some Information. Additional Text
        )

    [1] => Array
        (
            [name] => bf_1040242[17565][]
            [value] => 2
        )

    [2] => Array
        (
            [name] => bf_1040242[17565][]
            [value] => 1
        )

    [3] => Array
        (
            [name] => bf_1040242[17565][]
            [value] => 3
        )

    [4] => Array
        (
            [name] => bf_1040242[other][17565]
            [value] => Testing
        )

    [5] => Array
        (
            [name] => bf_1040242[597]
            [value] => 1
        )

    [6] => Array
        (
            [name] => bf_1040242[327]
            [value] => This is some text
        )

    [7] => Array
        (
            [name] => bf_1040242[328]
            [value] => asdasd
        )

    [8] => Array
        (
            [name] => bf_1040242[11880]
            [value] => wwwww
        )

    [9] => Array
        (
            [name] => bf_1040242[329]
            [value] => xxxxx
        )

    [10] => Array
        (
            [name] => bf_1040242[28622]
            [value] => 2
        )

    [11] => Array
        (
            [name] => bf_1040242[other][28623]
            [value] => 
        )

    [12] => Array
        (
            [name] => bf_1040242[42283]
            [value] => 1
        )

    [13] => Array
        (
            [name] => bf_1040242[42284][]
            [value] => 2
        )

    [14] => Array
        (
            [name] => bf_1040242[42284][]
            [value] => 3
        )

    [15] => Array
        (
            [name] => bf_1040242[42284][]
            [value] => 4
        )

    [16] => Array
        (
            [name] => bf_1040242[other][42284]
            [value] => Something Else
        )

)

在上面的数组中,键'name'代表字符串格式的单个数组结构,'value'保存数组结构需要更新的值。

这是通过使用

成功完成的
$extra = []

foreach ($mainArray as $key => $value)
{
    parse_str($value['name'], $tempArr);
    $m = $this->multiArr($k, $value);
    array_push($extra, $m);
}


protected function multiArr($k, $val)
{
    foreach($k as $key => $value)
    {
        if(is_array($value) ) $k[$key] =  $this->multiArr($k[$key], $val);

        if(!is_array($value))
        {
            $k[$key] = (string) $val['value'];
        }
    }
    return $k;
}

$m 保存单独的数组值,如

Array
(
    [bf_1040242] => Array
        (
            [other] => Array
                (
                    [42284] => Something Else
                )

        )

)

使用这些单独的数组值,我想创建所需的主要数组,所以我使用了

array_push($extra, $m);

但这会将每个 $m 数组添加到彼此下方,而不是按照上面预期的方式更新。 下面是我的结局。


Array
(
    [0] => Array
        (
            [bf_1040242] => Array
                (
                    [326] => Just some Information. Additional Text
                )

        )

    [1] => Array
        (
            [bf_1040242] => Array
                (
                    [17565] => Array
                        (
                            [0] => 2
                        )

                )

        )

    [2] => Array
        (
            [bf_1040242] => Array
                (
                    [17565] => Array
                        (
                            [0] => 1
                        )

                )

        )

    [3] => Array
        (
            [bf_1040242] => Array
                (
                    [17565] => Array
                        (
                            [0] => 3
                        )

                )

        )

    [4] => Array
        (
            [bf_1040242] => Array
                (
                    [other] => Array
                        (
                            [17565] => Testing
                        )

                )

        )

    [5] => Array
        (
            [bf_1040242] => Array
                (
                    [597] => 1
                )

        )

    [6] => Array
        (
            [bf_1040242] => Array
                (
                    [327] => This is some text
                )

        )

    [7] => Array
        (
            [bf_1040242] => Array
                (
                    [328] => asdasd
                )

        )

    [8] => Array
        (
            [bf_1040242] => Array
                (
                    [11880] => wwwww
                )

        )

    [9] => Array
        (
            [bf_1040242] => Array
                (
                    [329] => xxxxx
                )

        )

    [10] => Array
        (
            [bf_1040242] => Array
                (
                    [28622] => 2
                )

        )

    [11] => Array
        (
            [bf_1040242] => Array
                (
                    [other] => Array
                        (
                            [28623] => 
                        )

                )

        )

    [12] => Array
        (
            [bf_1040242] => Array
                (
                    [42283] => 1
                )

        )

    [13] => Array
        (
            [bf_1040242] => Array
                (
                    [42284] => Array
                        (
                            [0] => 2
                        )

                )

        )

    [14] => Array
        (
            [bf_1040242] => Array
                (
                    [42284] => Array
                        (
                            [0] => 3
                        )

                )

        )

    [15] => Array
        (
            [bf_1040242] => Array
                (
                    [42284] => Array
                        (
                            [0] => 4
                        )

                )

        )

    [16] => Array
        (
            [bf_1040242] => Array
                (
                    [other] => Array
                        (
                            [42284] => Something Else
                        )

                )

        )
)

我不确定 array_push 是我需要使用的,还是其他的。 另外,有没有更清洁或更有效的方法。

非常感谢任何帮助,谢谢

通常你会为此使用 array_merge_recursive,但它不会保留命名键,所以我写了一个 array_join 函数让生活更轻松:)

function array_join($value, &$result) {
    if (!is_array($value)) {
        $result = $value;
        
        return;
    }
    
    foreach ($value as $k => $v) {
        array_join($v, $result[$k]);
    }
}

$result = [];

foreach ($mainArray as $entry)
{
    parse_str($entry['name'] . '=' . $entry['value'], $nameArray);
    array_join($nameArray, $result);
}

我们简单地递归调用array_join直到值不再是数组。注意 array_join&$result 中的 &。我们传递数组中当前位置的引用。

为了充分利用 parse_str,我还通过附加 =<value>

添加了值

工作example

下一个 post 的专业提示。使用 var_export 给我们一个数组,可以将其复制粘贴为代码:)

编辑

更简单的解决方案,带有针对“邪恶”输入的转义值。

foreach ($mainArray as $entry)
{
    $stringVarArray[] = $entry['name'] . '=' . urlencode($entry['value']);
}
parse_str(implode('&', $stringVarArray), $result);

var_dump($result);

工作example