Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何按级别对多维数组进行分层排序_Php_Arrays_Recursion_Logic - Fatal编程技术网

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

Php 如何按级别对多维数组进行分层排序,php,arrays,recursion,logic,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

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

我从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;
}
我需要输出(按级别列):

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

**更新1:**
我不能随波逐流!我已经试了两天了!例如,我不知道如何从3级升级到1级,这似乎是不可能的

代码的主要问题是您没有区分级别的增加或减少。然而,要采取的行动将完全不同。在第一种情况下,您需要递归,在另一种情况下,您需要立即回溯(return)

我还建议不要修改传递给函数的数组,而是生成一个新数组。这是一种更为函数式的编程风格

我会这样写:

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;
}
函数构建层次结构(&$links,$level=1){
$result=[];
while(当前($links)){
如果(当前($links)[“级别”]>$level){
$result[max(0,count($result)-1)][“children”]=构建层次结构($links,$level+1);
}
如果(当前($links)[“级别”]<$level)返回$result;//回溯
$result[]=当前($links);
下一步(链接);
}
返回$result;
}

您的代码的主要问题是您无法区分增加或减少的级别。然而,要采取的行动将完全不同。在第一种情况下,您需要递归,在另一种情况下,您需要立即回溯(return)

我还建议不要修改传递给函数的数组,而是生成一个新数组。这是一种更为函数式的编程风格

我会这样写:

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;
}
函数构建层次结构(&$links,$level=1){
$result=[];
while(当前($links)){
如果(当前($links)[“级别”]>$level){
$result[max(0,count($result)-1)][“children”]=构建层次结构($links,$level+1);
}
如果(当前($links)[“级别”]<$level)返回$result;//回溯
$result[]=当前($links);
下一步(链接);
}
返回$result;
}

简而言之,按顺序遍历数组,当你遇到较深级别时,你会添加一个子数组,当你遇到相同级别时,你会继续添加到当前数组,当你遇到较高级别时,你会返回,对吗?@deceze Right!但是如何做到这一点呢?简单地说,按顺序遍历数组,当你遇到更深的级别时,你会添加一个子数组,当你遇到相同级别时,你会继续添加到当前数组中,当你遇到更高级别时,你会返回,对吗?@deceze Right!但是怎么做呢?谢谢你的帮助!我遇到了一些问题,比如说,当一个级别从1以外的数字开始,或者它从级别1开始,下一个级别是3。在这些情况下,它会显示“[-1]=>[-1]…”。我试图更改您的代码,但没有成功。我的解决方案是制作一个foreach并删除“-1”,但这似乎并不理想。是的,但是在这种情况下你希望发生什么?您能否编辑您的问题并添加两种场景的示例?例如,如果级别以2开始,但以1结束,那么应该发生什么?或者,如果从1跳到3,然后是2。结果数据结构应该是什么样的?当
count($result)-1
替换为
max(0,count($result)-1)
?结果类似于:[0]=>Array([0]=>Array('children'=>Array('level'=>'3','id'=>'item 3','content'=>'item 3');)是的,但我更感兴趣的是看看你们对这种情况的期望。你能用我之前评论中描述的例子更新你的问题吗?没有其他数据的中间
[0]
元素只是一个存根,表示“这里缺少了一个级别2——我没有数据显示在这里”。感谢您的帮助!我遇到了一些问题,比如说,当一个级别从1以外的数字开始,或者它从级别1开始,下一个级别是3。在这些情况下,它会显示“[-1]=>[-1]…”。我试图更改您的代码,但没有成功。我的解决方案是制作一个foreach并删除“-1”,但这似乎并不理想。是的,但是在这种情况下你希望发生什么?您能否编辑您的问题并添加两种场景的示例?例如,如果级别以2开始,但以1结束,那么应该发生什么?或者,如果从1跳到3,然后是2。结果数据结构应该是什么样的?当
count($result)-1
替换为
max(0,count($result)-1)
?结果类似于:[0]=>Array([0]=>Array('children'=>Array('level'=>'3','id'=>'item 3','content'=>'item 3');)是的,但我更感兴趣的是看看你们对这种情况的期望。你能用我之前评论中描述的例子更新你的问题吗?没有其他数据的中间
[0]
元素只是一个存根,表示“这里缺少了一个级别2——我没有数据显示在这里”。
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;
}