如何在PHP中将扁平数组转换为多维数组

如何在PHP中将扁平数组转换为多维数组,php,Php,我试图将数组的键值转换为多维数组。键值看起来是多维的,但只是文本。我尝试过分解字符串并创建一个新数组,但我觉得一定有比这更简单的方法 示例如下: Array ( [Template[URL]] => http://www.asdasdda.com [Template[UPC]] => 5484548546314 [Field[value]] => Test Example [Field[answer]] => 20 ) 非常感谢所有帮助。:) 更新: 这是在对数据运行

我试图将数组的键值转换为多维数组。键值看起来是多维的,但只是文本。我尝试过分解字符串并创建一个新数组,但我觉得一定有比这更简单的方法

示例如下:

Array (
[Template[URL]] => http://www.asdasdda.com
[Template[UPC]] => 5484548546314
[Field[value]] =>  Test Example
[Field[answer]] => 20 )
非常感谢所有帮助。:)

更新: 这是在对数据运行json_解码之前数据的精确输出

{"Template[URL]":"http://www.asdasdda.com","Template[UPC]":"5484548546314","Field[value]":"Test Example","Field[answer]":"20"}

我想我明白了。我认为没有更简单的方法:

foreach ($array as $key=>$value) {
    preg_match("/\[(.+)\]/",$key,$match);
    $newKey = preg_replace("/\[.+\]/","",$key);
    $newArray[$newKey][$match[1]] = $value;
}
其中,
$newArray
print\r()
如下所示:

Array ( 
    [Template] => Array ( 
        [URL] => http://www.asdasdda.com 
        [UPC] => 5484548546314 
        ) 
    [Field] => Array ( 
        [value] => Test Example 
        [answer] => 20 
        ) 
    )

可能应该在创建阵列的位置解决此问题。如果您没有访问权限,则可以使用带有引用循环的正则表达式来转换数组:

$array = [
"Template[URL]" => 'http://www.asdasdda.com',
"Template[UPC]" => '5484548546314',
"Multi[Level][Array]" => 'Hello World'
];

function convert(&$array, $key, $value) {
   preg_match_all("/(?=^)[^]]+(?=\[)|(?<=\[)[^]]+(?=\])/", $key, $keys);
   if ($keys = $keys[0]) {
       // Unset original key
       unset($array[$key]);
       // Dig into each level of keys and reassign the reference
       foreach($keys as $key) {
           if (!isset($array[$key])) $array[$key] = null;
           $array = &$array[$key];
       }
       // Set the final level equal to the original value
       $array = $value;
   }
}

foreach($array as $key=>$value) {
   convert($array, $key, $value);
}

print_r($array);

如果需要,可以使用引用来挖掘多个级别。

无法在创建数组的位置修复它?如果您的表示模板[URL]包含字符串值,这肯定会解决问题。这个模板[URL]是什么?它不是一个变量。。如果模板是一个数组,那么请适当地引用它,比如:$Template['URL']@Devon这是来自我公司另一个部门的API,而构建它的人不可能很难使用,所以我宁愿尝试转换它。有趣的是,他将其作为json发送,但没有对多维数组进行编码,只是将其展平。@animaacija数组的键值格式为“Template[URL]”,而不是“Template['URL]”。这就是我目前遇到的问题。可能不是数组,而是stdClass或smth?这是从哪里来的?那么URL是什么呢?常数如果是这样,它必须有价值。如果你只有一个级别,比如模板[URL],那么这将非常有效。如果您有多个级别,例如模板[1][URL],那么您可以在循环中查阅我的答案对引用的使用。@KevinWeber^上面的评论应该是针对您的。@Devon谢谢您Devon,我会将此页面作为书签,以便将来使用这些脚本。
Array
(
    [Template] => Array
        (
            [URL] => http://www.asdasdda.com
            [UPC] => 5484548546314
        )

    [Multi] => Array
        (
            [Level] => Array
                (
                    [Array] => Hello World
                )

        )

)