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

问题描述 投票:2回答:1

我需要按级别列分层排序数组。

我从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级,这似乎是不可能的!

php arrays recursion logic
1个回答
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;
}
© www.soinside.com 2019 - 2024. All rights reserved.