期待或回到foreach循环

时间:2011-01-18 13:47:18

标签: php arrays navigation foreach

我使用列表从二维数组渲染导航,如下所示:

<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序列中下一个数组的一些数据。我怎样才能找回来?

6 个答案:

答案 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++;
}

没有其他线索