当我遇到一些我在这里成功重新创建的意外行为时,我正在重写导航结构,按大小排序为多列。
我正在创建一个包含多个项目的数组,也包括数组。这些项包含一个名称,可能包含一个数组sub
,这是一个包含更多项的数组。这有可能嵌套到无穷大。
该列表将以HTML格式显示为多层ul
。
在这种情况下,使用重复函数是有意义的。如前所述,列表将在稍后按大小排序,因此我创建了变量$index
,它应该计算当前列表中项目的总数,但不是在一个级别之后继续计数已完成的PHP决定在重复打开函数之前使用上一次迭代。
下面的代码,输出和驱逐输出。
我的问题:有没有办法在整个函数中迭代变量$index
?
<!-- 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)
答案 0 :(得分:2)
如果您想在整个树中跟踪$index
的实际值,那么您可以将其作为参考(handleLists
)传递给&index
而不是值:< / p>
function handleLists($lists, &$index = 0, $level = 0) {
....
}
这样当你在递归调用(级别1)和增量$index
内时,那么这个索引也会在第一级(级别0)递增,因为它是你的同一个变量进入更深层次。
希望这有帮助。