简体   繁体   English

使用开始和停止限制级别递归地获取 PHP 数组树值

[英]Get with PHP Array Tree Values Recursively with start and stop limit level

I am making a module for creating navigation menus and I would like to give the possibility to set an initial and final level.我正在制作一个用于创建导航菜单的模块,我想提供设置初始和最终级别的可能性。 I have this array tree with level how can return it setting a start level and stop level?我有这个带有级别的数组树如何返回它设置开始级别和停止级别? this is my function that return empty.这是我返回空的函数。

Original Array:原始数组:

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] => 
        )

)

My function:我的功能:

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;

}

if I try:如果我尝试:

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

The result is empty:结果为空:

Array()

Where I am wrong?我哪里错了?

Thanks.谢谢。

During simple foreach loop you need to check the main index children and in case of it has array datatype you need to turn on recursive action (use is_array($page['children']) ):在简单的foreach循环中,您需要检查主索引children项,如果它具有数组数据类型,您需要打开递归操作(使用is_array($page['children']) ):

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

In case of non-array you can just append this values to the result array if the level is in range:在非数组的情况下,如果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']
     ); 
} 

In case of array datatype you need to do the same, but with recursive action:在数组数据类型的情况下,您需要执行相同的操作,但要进行递归操作:

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

@ hides warnings , so the result body of the function looks like next: @隐藏警告,因此函数的结果主体如下所示:

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

For example, $res = get_tree_limit($ar, 2, 3);例如, $res = get_tree_limit($ar, 2, 3); returns only 2 and 3 levels of the tree:仅返回树的2层和3层:

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

        )

)

Demo 演示

You can choose any level range and you'll get correspond tree branch.您可以选择任何级别范围,您将获得相应的树枝。

Ok this function does its job and I insert if someone is looking for it and to receive some suggestions.好的,这个功能完成了它的工作,如果有人正在寻找它并收到一些建议,我会插入。 I also added the control in the case start and stop are 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;

}

test测试

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM