【问题标题】:Get with PHP Array Tree Values Recursively with start and stop limit level使用开始和停止限制级别递归获取 PHP 数组树值
【发布时间】:2019-11-30 12:46:17
【问题描述】:

我正在制作一个用于创建导航菜单的模块,我想提供设置初始和最终级别的可能性。我有这个具有级别的数组树如何返回它设置开始级别和停止级别?这是我返回空的函数。

原始数组:

Array
(
    [0] => Array
        (
            [id] => 22
            [pid] => 12
            [level] => 0
            [children] => 
        )

    [1] => Array
        (
            [id] => 24
            [pid] => 12
            [level] => 0
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 27
                            [pid] => 24
                            [level] => 1
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 28
                                            [pid] => 27
                                            [level] => 2
                                            [children] => 
                                        )

                                )

                        )

                )

        )

    [2] => Array
        (
            [id] => 25
            [pid] => 12
            [level] => 0
            [children] => 
        )

    [3] => Array
        (
            [id] => 26
            [pid] => 12
            [level] => 0
            [children] => 
        )

)

我的功能:

function get_tree_limit ($pages, $start_level, $stop_level) {

    $result = Array();

    foreach( $pages as $page ) {

        $children = Array();

        if(isset($page['children'])){
            $children = get_tree_limit ($page['children'], $start_level, $stop_level);
        }

        if($page['level'] >= $start_level && $page['level'] <= $stop_level){

            $result[] = Array(
                'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level'],
                'children' => $children
            );

        }

    }

    return $result;

}

如果我尝试:

$rpage = get_tree_limit ($pages, 1, 2);
print_r($rpage);

结果为空:

Array()

我哪里错了?

谢谢。

【问题讨论】:

  • 问题是在级别 0,虽然你设置了$children - 你永远不会在任何地方添加它来返回。
  • @NigelRen 如果没有孩子,则应将数组返回为空。如果我删除条件开始和停止水平返回正确。但是粗略地说,我的概念是错误的,或者我解决了自己的问题。你能写出正确的函数还是难以理解。谢谢。
  • $pages 中有什么?
  • @ShringirajDewangan $pages of rough 是您可以在帖子顶部看到的原始数组。
  • $result 变量的范围仅在函数中,返回值仅适用于键 0,您的起始级别为 1

标签: php arrays recursion


【解决方案1】:

在简单的foreach 循环期间,您需要检查主索引children,如果它具有数组数据类型,您需要打开递归操作(使用 is_array($page['children'])):

if(is_array($page['children'])){ } else {  }

在非数组的情况下,如果level 在范围内,则只需将此值附加到结果数组:

if(   $page['level'] >= $start_level 
   && $page['level'] <= $stop_level 
   && is_numeric($page['level'])
  ){
     $result[$ind] = Array(
                        'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level'], 
                        'children' => $page['children']
     ); 
} 

如果是数组数据类型,您需要做同样的事情,但使用递归操作:

if(  $page['level'] >= $start_level 
  && $page['level'] <= $stop_level 
  && is_numeric($page['level'])){ 

  $result[$ind] = Array(
                        'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level'], 
                        'children' => @get_tree_limit($page, $start_level, $stop_level)['children'] 
  );   
}

if (!isset($result[$ind]) ) {
    if (@count(get_tree_limit($page, $start_level, $stop_level)['children'])>0){
        $result[$ind] = @get_tree_limit($page, $start_level, $stop_level)['children'];
    }
} 

@ 隐藏了警告,因此函数的结果体如下所示:

$result = Array();

foreach($pages as $ind => $page ) {

        if(is_array($page['children'])){ 

           if($page['level'] >= $start_level 
           && $page['level'] <= $stop_level 
           && is_numeric($page['level'])){ 
                //print_r($page);
                $result[$ind] = Array(
                    'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level'], 
                    'children' => @get_tree_limit($page, $start_level, $stop_level)['children'] 
                );   
            }

            if (!isset($result[$ind]) ) {
               if (@count(get_tree_limit($page, $start_level, $stop_level)['children'])>0){
                    $result[$ind] = @get_tree_limit($page, $start_level, $stop_level)['children'];
               }
            } 

        } else {
            if($page['level'] >= $start_level && $page['level'] <= $stop_level && is_numeric($page['level'])){
                $result[$ind] = Array(
                    'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level'], 
                    'children' => $page['children']
                ); 
            } 
        } 
}

return $result;  

例如,$res = get_tree_limit($ar, 2, 3); 仅返回树的 23 层:

Array
(
    [0] => Array
        (
            [id] => 28
            [pid] => 27
            [level] => 2
            [children] => Array
                (
                    [id] => 29
                    [pid] => 28
                    [level] => 3
                    [children] => 2
                )

        )

)

Demo

你可以选择任何级别范围,你会得到相应的树枝。

【讨论】:

  • 您的代码完成了它的工作并且看起来非常干净。恭维!我一直说程序员应该写代码,避免文字:) 谢谢
  • 测试你的代码 我检查了有一个小问题。如果开始或停止限制为 0,则应忽略。我的意思是,如果您设置 start_level = 2 和 stop_level = 0 应该显示级别 2、3。相同的开始级别 0 停止级别 2 应该显示级别 0、1、2。是 start_level=0 和 stop_level=0 应该显示 0,1,2,3。
  • @DaebakDo,不,它作为 范围 - 您可以选择 from 级别 to 级别。 0-0 - 给出 0 个级别,0-1 - 给出前 2 个,1-2 - 给出 12
  • 如果你愿意,我可以按照你的意愿解决这个问题。
  • 谢谢你的好意。顺便说一句,如果孩子不存在返回错误。为此,我的代码太长了:D
【解决方案2】:

好的,这个函数完成了它的工作,如果有人正在寻找它并收到一些建议,我会插入。我还添加了在 start 和 stop 为 null 的情况下的控件。

function get_tree_limit ($pages, $start_level, $stop_level) {

    $result = Array();

    foreach($pages as $page) {

        $children = Array();

        if(isset($page['children'])){
            $children = get_tree_limit ($page['children'], $start_level, $stop_level);
        }

        if($start_level > 0 && $stop_level > 0){

            if(!empty($children)){

                if($page['level'] >= $start_level && $page['level'] <= $stop_level){

                    $result[] = Array(
                        'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level'], 'children' => $children
                    );

                } else {

                    $result = $children;

                }

            } else {

                if($page['level'] >= $start_level && $page['level'] <= $stop_level){

                    $result[] = Array(
                        'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level']
                    );

                }

            }

        } elseif($start_level <= 0 && $stop_level > 0) {

            if(!empty($children)){

                if($page['level'] <= $stop_level){

                    $result[] = Array(
                        'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level'], 'children' => $children
                    );

                } else {

                    $result = $children;

                }

            } else {

                if($page['level'] <= $stop_level){

                    $result[] = Array(
                        'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level']
                    );

                }

            }

        } elseif($start_level > 0 && $stop_level <= 0) {

            if(!empty($children)){

                if($page['level'] >= $start_level){

                    $result[] = Array(
                        'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level'], 'children' => $children
                    );

                } else {

                    $result = $children;

                }

            } else {

                if($page['level'] >= $start_level){

                    $result[] = Array(
                        'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level']
                    );

                }

            }

        } else {

            if(!empty($children)){

                $result[] = Array(
                    'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level'], 'children' => $children
                );

            } else {

                $result[] = Array(
                    'id' => $page['id'], 'pid' => $page['pid'], 'level' => $page['level']
                );              

            }

        }

    }

    return $result;

}

测试

http://sandbox.onlinephpfunctions.com/code/4e9b1822d294f0af65f81a8ad9ce5f61db7e43f7

【讨论】:

猜你喜欢
  • 2018-05-28
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 2012-03-18
  • 2012-07-15
相关资源
最近更新 更多