如何按级别对多维数组排序

时间:2019-04-12 08:58:05

标签: php arrays recursion logic

我需要按级别列对数组进行排序。

我从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'   
    )
)

我不能这样做!我需要你的帮助。

**更新1:**

我不能顺其自然!我已经尝试了两天!例如,我不知道如何从3级转到1级,这似乎是不可能的!

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