递归函数不按预期迭代变量

时间:2018-03-24 13:26:07

标签: php loops foreach iteration

当我遇到一些我在这里成功重新创建的意外行为时,我正在重写导航结构,按大小排序为多列。

我正在创建一个包含多个项目的数组,也包括数组。这些项包含一个名称,可能包含一个数组sub,这是一个包含更多项的数组。这有可能嵌套到无穷大。 该列表将以HTML格式显示为多层ul。 在这种情况下,使用重复函数是有意义的。如前所述,列表将在稍后按大小排序,因此我创建了变量$index,它应该计算当前列表中项目的总数,但不是在一个级别之后继续计数已完成的PHP决定在重复打开函数之前使用上一次迭代。

下面的代码,输出和驱逐输出。

我的问题:有没有办法在整个函数中迭代变量$index

PHP代码:

<!-- language: php -->
<?php
$lists = [
    [
        'name' => 'level0-item',
        'sub' => [
            ['name' => 'level1-item'],
            ['name' => 'level1-item'],
            ['name' => 'level1-item'],
            [
                'name' => 'level1-item',
                'sub' => [
                    ['name' => 'level2-item'],
                    ['name' => 'level2-item'],
                ]
            ],
            [
                'name' => 'level1-item',
                'sub' => [
                    ['name' => 'level2-item'],
                    ['name' => 'level2-item'],
                ]
            ],
        ]
    ],

    [
        'name' => 'level0-item',
        'sub' => [
            ['name' => 'level1-item'],
            ['name' => 'level1-item'],
            ['name' => 'level1-item'],
        ]
    ]
];

function handleLists($lists, $index = 0, $level = 0) {
    echo '<ul>';
    foreach ($lists as $list) {
        echo '<li>';
        $index++; // increas index
        echo $list['name'] . ' - level: ' . $level . ' - index: ' . $index;

        if ($list['sub'])
            handleLists($list['sub'], $index, $level+1); // recursive call
        echo '</li>';
    }
    echo '</ul>';
}

handleLists($lists);
?>

输出:

  
      
  • level0-item - 级别:0 - 索引: 1      
        
    • level1-item - 级别:1 - 索引: 2
    •   
    • level1-item - 级别:1 - 索引: 3
    •   
    • level1-item - 级别:1 - 索引: 4
    •   
    • level1-item - 级别:1 - 索引: 5      
          
      • level2-item - level:2 - index: 6
      •   
      • level2-item - 级别:2 - 索引: 7
      •   
    •   
    • level1-item - 级别:1 - 索引: 6      
          
      • level2-item - 级别:2 - 索引: 7
      •   
      • level2-item - level:2 - index: 8
      •   
    •   
  •   
  • level0-item - 级别:0 - 索引: 2      
        
    • level1-item - 级别:1 - 索引: 3
    •   
    • level1-item - 级别:1 - 索引: 4
    •   
    • level1-item - 级别:1 - 索引: 5
    •   
  •   

预期输出:

  
      
  • level0-item - 级别:0 - 索引: 1      
        
    • level1-item - 级别:1 - 索引: 2
    •   
    • level1-item - 级别:1 - 索引: 3
    •   
    • level1-item - 级别:1 - 索引: 4
    •   
    • level1-item - 级别:1 - 索引: 5      
          
      • level2-item - level:2 - index: 6
      •   
      • level2-item - 级别:2 - 索引: 7
      •   
    •   
    • level1-item - 级别:1 - 索引: 8      
          
      • level2-item - level:2 - index: 9
      •   
      • level2-item - 级别:2 - 索引: 10
      •   
    •   
  •   
  • level0-item - 级别:0 - 索引: 11      
        
    • level1-item - 级别:1 - 索引: 12
    •   
    • level1-item - 级别:1 - 索引: 13
    •   
    • level1-item - 级别:1 - 索引: 14
    •   
  •   

加成

我本可以错误地理解嵌套的foreach- / for-loops,这里有一些希望可以理解的伪代码,每次新的foreach打开时我都会增加1。

预期行为:

i = 0

//步骤1
foreach1打开i = 1

//步骤2
foreach1
__foreach2打开i = 2

//步骤3
foreach1
__foreach2
foreach1打开i = 3

//步骤4
foreach1
__foreach2
foreach1
__foreach2打开i = 4

表观行为:

i = 0

//步骤1
foreach1打开i = 1

//步骤2
foreach1
foreach1打开i = 2

//步骤3
foreach1
__foreach2打开i = 2(导致前一个foreach1 i = 1)
foreach1

//步骤4
foreach1
__foreach2
foreach1
__foreach2打开i = 3(导致之前的foreach1 i = 2)

1 个答案:

答案 0 :(得分:2)

如果您想在整个树中跟踪$index的实际值,那么您可以将其作为参考(handleLists)传递给&index而不是值:< / p>

function handleLists($lists, &$index = 0, $level = 0) { 
....
}

这样当你在递归调用(级别1)和增量$index内时,那么这个索引也会在第一级(级别0)递增,因为它是你的同一个变量进入更深层次。

希望这有帮助。