【问题标题】:How to sort hierarchically multidimensional Array by level如何按级别对分层多维数组进行排序
【发布时间】:2019-04-12 08:58:04
【问题描述】:

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

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

【问题讨论】:

  • 简单来说就是按顺序遍历数组,遇到deeper层级就添加子数组,遇到同层级就不断添加当前的数组,遇到更高的级别就回上去,对吗?
  • @deceze 对!但是该怎么做呢?

标签: php arrays recursion logic


【解决方案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;
}

【讨论】:

  • 感谢您的帮助!例如,当级别以 1 以外的数字开头或从级别 1 开始而下一个级别是 3 时,我遇到了问题。在这些情况下,它会显示“[-1] => [-1] ...”。我试图更改您的代码,但没有成功。我的解决方案是创建一个 foreach 并删除“-1”,但这似乎并不理想。 sandbox.onlinephpfunctions.com/code/…
  • 是的,但是在这些情况下您希望做什么?您可以编辑您的问题并添加两种情况的示例吗?例如,如果关卡以 2 开头,但以 1 结尾,那么会发生什么?或者,如果从 1 跳转到 3,然后是 2。生成的数据结构应该是什么样的?
  • count($result)-1 被替换为max(0, count($result)-1) 会是你想要的吗?
  • 结果类似于: [0] => Array( [0] => Array( 'children' => Array( 'level' => '3', 'id' => '项目 3', '内容' => '项目 3' ); ) )
  • 是的,但我更想了解您对此类情况的期望。你能用我之前评论中描述的例子来更新你的问题吗?没有其他数据的中间 [0] 元素只是一个存根,表示“这里缺少第 2 级 -- 我这里没有数据可显示”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 2021-07-11
  • 2013-12-09
相关资源
最近更新 更多