我使用列表从二维数组渲染导航,如下所示:
<ul> <li>parent
<ul> <li>level 1</li> <li>level 1
<ul> <li>level 3</li> </ul>
</li> </ul>
<li> </ul>
</li> </ul>
无论如何要正确关闭<li>
和</ul>
,我发现我需要来自foreach序列中下一个数组的一些数据。我怎样才能找回来?
答案 0 :(得分:4)
虽然过去我的搜索结果不稳定,但您可以使用以下函数移动当前数组指针。
希望这会有所帮助。
答案 1 :(得分:1)
这是一个解决方案:
$arr = array(1,2,3,4,5);
foreach ($arr as $foo) {
if (empty($isrewind)) {
reset($arr);
$isrewind = true;
}
echo "node: $foo\n";
$copy = $arr; // make a copy of the array
$next = next($copy);
echo "next: $next\n";
$copy = $arr; // make a copy of the array
$prev = prev($copy);
echo "prev: $prev\n";
next($arr); // don't forget to advance the pointer on the original array
}
我已经为示例演示了prev
位。通过在每次迭代结束时保存元素,您可以轻松地在没有prev()
的情况下执行此操作。
if empty
位将数组指针重置为开头,因为foreach
会在指针生成数组副本时将指针前进一次。
以上示例产生:
node: 1
next: 2
prev:
node: 2
next: 3
prev: 1
node: 3
next: 4
prev: 2
node: 4
next: 5
prev: 3
node: 5
next:
prev: 4
如果你不得不做这样的事情,那么可能只是通过重新安排你的数据结构(没有代码很难分辨)。
答案 2 :(得分:0)
IHMO在具有非数字索引的数组上使用简单的foreach循环是不可能的。但是你可以扩展SPL类CachingIterator来包装你的数组。在扩展类中,您可以实现返回上一个和下一个索引/值的方法,而无需推进内部元素指针。
如果你有一个带有数字索引的数组,则使用for循环而不是foreach。然后,您可以使用$i+1
和$i-1
查看与当前索引不同的数组索引。
答案 3 :(得分:0)
不确定这是否是他所要求的,但这是我的镜头
$list = array (
'Home page' => null,
'Articles' => array (
'Diving' => null,
'Skydiving' => null,
'Stackoverflowing' => null,
),
'Nobody cares' => array (
'Hey' => null,
'It is just a test' => null,
),
);
function render_menu ($list)
{
echo "<ul>\n";
foreach ($y = new RecursiveArrayIterator ($list, RecursiveIteratorIterator::SELF_FIRST) as $key => $item)
{
if ($y->hasChildren ())
{
echo "<li>$key\n";
render_menu ($item);
echo "</li>\n";
}
else
{
echo "<li>$key</li>\n";
}
}
echo "</ul>\n";
}
render_menu ($list);
答案 4 :(得分:0)
找到答案盯着我的脸。检索我需要的数组:
foreach($ tree as $ key =&gt; $ link){
$ level = $ link ['level'];
$ next_key = $ key + 1;
$ prev_key = $ key-1;
$ next_array = $ tree [$ next_key];
$ prev_array = $ tree [$ prev_key];
然后我可以使用一大堆if语句测试level属性(在导航树中指示deph)以正确插入结束标记。
凌乱的代码,我并不以此为荣,但它确实有效!
对自己以前没有看到它感到生气。
答案 5 :(得分:-3)
我假设您使用的是php。我不认为这是可能的,你必须知道元素的索引和索引数组。是这样的:
$i=0;
foreach ($array as $element){
echo $element;
//do sth with $array[$i+1];
//do sth with $array[$i-1];
$i++;
}
没有其他线索