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

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";

A 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 字符串。

这是一个递归技术...

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

代码:(Demo)

$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',
      ),
    ),
  ),
)