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

时间:2015-04-22 16:19:27

标签: php

我正在尝试将数组的键值转换为多维数组。键值看起来是多维的,但只是文本。我试过爆炸字符串并创建一个新数组,但我觉得必须有一些比这更简单的东西。

以下示例:

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

所有帮助都非常适合。 :)

更新: 在我对数据运行json_decode之前,这是数据的确切输出。

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

2 个答案:

答案 0 :(得分:4)

摆弄了一下,我想我明白了。我认为没有更简单的方法:

foreach ($array as $key=>$value) {
    preg_match("/\[(.+)\]/",$key,$match);
    $newKey = preg_replace("/\[.+\]/","",$key);
    $newArray[$newKey][$match[1]] = $value;
}

print_r()的{​​{1}}如下:

$newArray

答案 1 :(得分:2)

应该在创建数组的地方解决问题。如果您无权访问,那么您可以使用带引用循环的正则表达式来转换数组:

$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);

输出:

Array
(
    [Template] => Array
        (
            [URL] => http://www.asdasdda.com
            [UPC] => 5484548546314
        )

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

        )

)

使用引用,以便您可以根据需要挖掘多个级别。