从数组构建分层列表

时间:2013-05-01 16:45:31

标签: php arrays

我有一系列看起来像

的类别
array(
  array(
    'id' => '1',
    'path' => '1',
    'children_count' => '16',
    'name' => 'A'
  ),
  array(
    'id' => '3',
    'path' => '1/2/3',
    'children_count' => '0',
    'name' => 'C'
  ),
  array(
    'id' => '2',
    'path' => '1/2',
    'children_count' => '9',
    'name' => 'B'
  ),
  array(
    'id' => '4',
    'path' => '1/2/4',
    'children_count' => '0',
    'name' => 'D'
  )
)

我正在尝试构建的是一个层级数组(path键显示基于id的关系),因此输出的顺序正确(首先是root父级,然后是子级,然后是更多的孩子)并根据孩子的下降程度缩进name。最终结果应该类似于:

A
-B
--C
--D

这是我到目前为止所拥有的,但显然不起作用

$categoryTree = array();

foreach ($categories as $category) {

    $categoryTree[(string)$category['path']] = str_repeat("-", substr_count($category['path'], "/")) . $category['name'];
}

ksort($categoryTree);

var_export($categoryTree);

其中包括:

array (
  '1/2' => '-B',
  '1/2/3' => '--C',
  '1/2/4' => '--D',
  1 => 'A'
)

如何以正确的顺序获取这些内容? (如果兄弟姐妹可以通过id订购也是花花公子的话)

2 个答案:

答案 0 :(得分:1)

计算生成值前缀的斜杠数,然后按路径(键)排序?

foreach ($categories as $category)
  $output[$category['path']] =
    str_repeat('-', substr_count($category['path'], '/')) . $category['name'];

ksort($output, SORT_STRING);

答案 1 :(得分:1)

这是基于One Trick Pony的答案,但正确处理多个数字的ID。

foreach ($categories as $category)
  $output[$category['path']] =
    str_repeat('-', substr_count($category['path'], '/')) . $category['name'];

$paths = array_keys($output);
natsort($paths);

foreach ($paths as $path) {
  echo $output[$path], "\n";
}