将多维数据转换为命名的父子层次结构


Convert multidimensional data into named parent-child hierarchy

我有一个php数组,生成如下:

$array['Top Level']['Level 2: A']['Son of A'] = "item";
$array['Top Level']['Level 2: A']['Daughter of A'] = "item";
$array['Top Level']['Level 2: B'] = "item";

json_encode给我以下输出:

{
   "Top Level":{
      "Level 2: A":{
         "Son of A":"item",
         "Daughter of A":"item"
      },
      "Level 2: B":"item"
   }
}

我需要的输出如下:

{
   "name":"Top Level",
   "parent":"null",
   "children":[
      {
         "name":"Level 2: A",
         "parent":"Top Level",
         "children":[
            {
               "name":"Son of A",
               "parent":"Level 2: A"
            },
            {
               "name":"Daughter of A",
               "parent":"Level 2: A"
            }
         ]
      },
      {
         "name":"Level 2: B",
         "parent":"Top Level"
      }
   ]
}

我怎么能意识到这一点?由于我的数据源,另一种实现方法不适用。

您需要使用已有的键将元素添加到数组中,以便获得以下内容:

$array = array (
    "name" => "Top Level",
    "parent" => "null",
    "children" => array (
        "name" => "Level 2: A",
        "parent" => "Top Level",
        "children" => array (
            // ...
        )
    )
);

据我所知,唯一的方法是更改或重组数组。

json_encode函数只会将数组结构转换为json字符串。

这里有一个递归技术。。。

迭代每个级别,然后在级别元素包含子数组时递归。如果没有子数组,则写入一个空数组。根据问题要求,立即删除可能为空的子数组。

代码:(演示)

$array['Top Level']['Level 2: A']['Son of A'] = "item";
$array['Top Level']['Level 2: A']['Daughter of A'] = "item";
$array['Top Level']['Level 2: B'] = "item";
function recurse($array, $parent = null) {
    $entries = [];
    foreach ($array as $key => $value) {
        $temp = [
            'name' => $key,
            'parent' => $parent,
            'children' => is_array($value)
                ? recurse($value, $key)
                : []
        ];
        if (!$temp['children']) {
            unset($temp['children']);
        }
        $entries[] = $temp;
    }
    return $entries;
}
var_export(recurse($array));

输出:

array (
  0 => 
  array (
    'name' => 'Top Level',
    'parent' => NULL,
    'children' => 
    array (
      0 => 
      array (
        'name' => 'Level 2: A',
        'parent' => 'Top Level',
        'children' => 
        array (
          0 => 
          array (
            'name' => 'Son of A',
            'parent' => 'Level 2: A',
          ),
          1 => 
          array (
            'name' => 'Daughter of A',
            'parent' => 'Level 2: A',
          ),
        ),
      ),
      1 => 
      array (
        'name' => 'Level 2: B',
        'parent' => 'Top Level',
      ),
    ),
  ),
)