我需要按级别列分层排序数组。
我从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级,这似乎是不可能的!
您的代码的主要问题是您不区分增加或减少的级别。然而,采取的行动将完全不同。在第一种情况下你需要递归,在另一种情况下你需要立即回溯(返回)
我还建议不要改变传递给函数的数组,而是生成一个新数组。这是更具功能性的编程风格。
我是这样写的:
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;
}