我需要按级别列对数组进行排序。
我从HTML标头(h1,h2,h3 ...)提取此数据,并且需要将它们按层次结构组织在一个数组中。基本上,这将用于显示“目录”。
**编辑**
// The soluction (Thanks @trincot)
static public function build_hierarchy( &$links, $level = 1 ) {
$result = [];
while (current($links)) {
if ( current($links)["level"] > $level ) {
$result[ count($result)-1 ]["children"] = static::build_hierarchy($links, $level+1);
}
if (current($links)["level"] < $level ) return $result; // backtrack
$result[] = current($links);
next($links);
}
return $result;
}
我有以下数组:
Array(
[0] = Array(
'level' => '1',
'id' => 'item 1',
'content' => 'item 1'
),
[1] = Array(
'level' => '1',
'id' => 'item 2',
'content' => 'item 2'
),
[2] = Array(
'level' => '2',
'id' => 'item 3',
'content' => 'item 3'
),
[3] = Array(
'level' => '2',
'id' => 'item 4',
'content' => 'item 4'
),
[4] = Array(
'level' => '2',
'id' => 'item 5',
'content' => 'item 5'
),
[5] = Array(
'level' => '3',
'id' => 'item 6',
'content' => 'item 6'
),
[6] = Array(
'level' => '1',
'id' => 'item 7',
'content' => 'item 7'
),
)
我需要输出(按级别列):
Array(
[0] = Array(
'level' => '1',
'id' => 'item 1',
'content' => 'item 1'
),
[1] = Array(
'level' => '1',
'id' => 'item 2',
'content' => 'item 2',
'childrens' => Array(
[0] = Array(
'level' => '2',
'id' => 'item 3',
'content' => 'item 3'
),
[1] = Array(
'level' => '2',
'id' => 'item 4',
'content' => 'item 4'
),
[2] = Array(
'level' => '2',
'id' => 'item 5',
'content' => 'item 5',
'childrens' => Array(
[0] = Array(
'level' => '3',
'id' => 'item 6',
'content' => 'item 6'
)
)
),
)
),
[2] = Array(
'level' => '1',
'id' => 'item 7',
'content' => 'item 7'
)
)
我不能这样做!我需要你的帮助。
我不能顺其自然!我已经尝试了两天!例如,我不知道如何从3级转到1级,这似乎是不可能的!
答案 0 :(得分:0)
您的代码的主要问题是您不区分增加或减少的级别。然而,要采取的行动将完全不同。在第一种情况下,您需要递归,在另一种情况下,您需要立即回溯(返回)
我还建议不要更改传递给函数的数组,而要生成一个新数组。这是更具功能性的编程风格。
这是我的写法:
function build_hierarchy(&$links, $level = 1) {
$result = [];
while (current($links)) {
if (current($links)["level"] > $level ) {
$result[max(0, count($result)-1)]["children"] = build_hierarchy($links, $level+1);
}
if (current($links)["level"] < $level ) return $result; // backtrack
$result[] = current($links);
next($links);
}
return $result;
}