【问题标题】:Looking foward or back in a foreach loop在 foreach 循环中向前或向后
【发布时间】:2011-01-18 13:47:17
【问题描述】:

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

<ul> <li>parent 
<ul> <li>level 1</li> <li>level 1

<ul> <li>level 3</li> </ul>

</li> </ul>

<li> </ul>

</li> </ul>

无论如何要正确关闭&lt;li&gt;&lt;/ul&gt;,我发现我需要来自foreach 序列中下一个数组的一些数据。我怎样才能找回这个?

【问题讨论】:

  • 请提供minimal sample code 向我们展示您在做什么。
  • 您正在处理一个数组,您可以随时使用数组中的所有数据。
  • 由于您正在使用,我假设是类别,我建议您调查一下:dev.mysql.com/tech-resources/articles/hierarchical-data.html 这样您的类别都是通过查询等为您设置的。无论哪种方式都很好阅读: )
  • 倒退很简单。只需保存前一个元素。
  • 如果我理解你的问题,你可能想使用RecursiveArrayIterator-&gt;getDepth,不需要做圆顶nextprev魔法......

标签: php arrays navigation foreach


【解决方案1】:

虽然我过去使用它们的结果不稳定,但您可以使用以下函数来移动当前数组指针。

希望这会有所帮助。

【讨论】:

  • +1 问题的正确答案,但可能是错误的解决方法。
  • 只需将foreach ($array as $key =&gt; $value) 替换为while(list($key, $value) = each($array))
【解决方案2】:

这里有一个解决方案:

$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

如果你必须做这样的事情,可能是一个更好的方法,只需重新排列你的数据结构(没有代码很难说)。

【讨论】:

    【解决方案3】:

    IHMO 在具有非数字索引的数组上使用简单的 foreach 循环是不可能的。但是您可以扩展 SPL 类 CachingIterator 以将您的数组包装在其中。在您的扩展类中,您可以实现方法来返回上一个和下一个索引/值,而无需推进内部元素指针。

    如果您有一个带有数字索引的数组,请使用 for 循环而不是 foreach。然后,您可以使用$i+1$i-1 查看与当前索引不同的数组索引。

    【讨论】:

    • 你能解释一下吗?链接的页面未完成
    【解决方案4】:

    不确定这是否是他要求的,但这是我的目标

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

    【讨论】:

      【解决方案5】:

      找到了直面我的答案。像这样检索我需要的数组:

      foreach ($tree as $key => $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),以正确插入结束标记。

      凌乱的代码,我并不为此感到自豪,但它确实有效!

      对自己之前没有看到它感到很生气。

      【讨论】:

      • &gt; 用于引用。要将行格式化为代码,请将它们缩进四个空格。您还可以使用编辑器工具栏中的“{}”按钮来切换代码格式。立即编辑您的答案并尝试一下。单击编辑器工具栏中的橙色问号以获取有关格式设置的更多信息和提示。
      【解决方案6】:

      我假设您使用的是 php。我认为不可能,您必须知道元素的索引并索引数组。像这样的:

      $i=0;
      foreach ($array as $element){
          echo $element;
          //do sth with $array[$i+1];
          //do sth with $array[$i-1];
          $i++;
      }
      

      没有其他线索

      【讨论】:

      • 您认为这不可能,但您给出了解决方案?这是怎么回事?
      • 谁弃用了foreach ($array as $index =&gt; $element) 构造? :)
      • 好吧,你是对的。 @Tharkun,在我看来,我给出的解决方法不是解决问题的真正方法
      猜你喜欢
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      • 2019-07-18
      • 1970-01-01
      相关资源
      最近更新 更多