【问题标题】:How would I use "foreach" instead of "for" loop for this case?在这种情况下,我将如何使用“foreach”而不是“for”循环?
【发布时间】:2012-04-08 18:49:04
【问题描述】:

我想制作一个循环来显示每个类别和所有子类别。我有这个数组:

$Allcategories = array(
  array(
    array("Category 1", 'category1'),
    array("Sub 1", 'sub1'),
    array("Sub 2", 'sub2'), 
    array("Sub 3", 'sub3') 
  ),
  array(
      array("Category 2", 'category2'),
      array("Sub 1", 'sub1'),
      array("Sub 2", 'sub2'), 
      array("Sub 3", 'sub3')
    )
);

我已经制作了一个可以工作的 3-nest-for 循环,但我想用 foreach 简化它。 这是我的 for 循环:

foreach ($Allcategories as $val_1)
{    
    echo "<a href='index.php?category=", $val_1[0][1], "'>", $val_1[0][0], "</a>";    
    foreach ($val_1 as $val_2)
    {    
        foreach ($val_2 as $val_3)
        {
            printf('<li><a href="index.php?category=%1$s">%1$s</a><br />', $val_3);
        }    
    }    
}

问题是我得到了这个结果:

Category 1

    -Category 1

    -category1

    -Sub 1

    -sub1

    -Sub 2

    -sub2

【问题讨论】:

  • 我缩进了原始数组,因此深度变化更加明显。您需要在代码中处理这些深度变化,否则它不会输出预期的数据。
  • 哦,好的,非常感谢,我现在看得更清楚了。我删除了第二类不需要的数组。我仍然得到类别 1,然后是类别 1,然后是子 1,然后是子 1.. 非常混乱。

标签: php loops foreach


【解决方案1】:

内部循环不应该遍历$Allcategories,而是遍历来自外部循环的值:

foreach ($Allcategories as $layerNum => $layer) {
    ...
    foreach ($layer as $rowNum => $row) {
        ...
        foreach ($row as $colNum => $category) {

【讨论】:

  • 您好,感谢您的回复。我已经用结果编辑了我的原始帖子。如果您知道出了什么问题,请告诉我。非常感谢
【解决方案2】:

虽然您应该按照 ruakh 所示的方式编写它,但知道您的代码的问题是您忘记引用 $key3 可能会很有用。应该是:

echo "<li><a href='index.php?category=".$Allcategories[$key1][$key2][$key3]
[1]."'>".$Allcategories[$key1][$key2][$key3][0]."</a><br />";

编辑:或者更好的是,整件事:

foreach ($Allcategories as $val_1)
{

  echo "<a href='index.php?category=" . $val_1[0][1] . "'>" . $val_1[0][0] . "</a>";

  foreach ($val_1 as $val_2)
  {

    foreach ($val_2 as $val_3)
    {
      echo "<li><a href='index.php?category=" . $val_3[1] . "'>" . $val_3[0] . "</a><b></li>";
    }

  }

}

我也冒昧地删除了&lt;br /&gt;,而是关闭了&lt;li&gt;,因为我相信这就是你想要的?

【讨论】:

  • 嗨,迈克尔,感谢您的回复。我认为是 $Allcategories[$key1][$key2][$key3],因为使用 [0],它最终只显示每个元素的第一个字母。
  • 我试过你的代码,但它显示的是 Sub 1,然后是 sub1,然后是 Sub 2,然后是 sub2。我现在正在尝试修改它。
  • 你能告诉我们print_r($Allcategories);的输出吗?
  • 嗨,我复制粘贴了原始帖子开头的数组。我还修改了原始帖子以显示我的循环的输出。它重复每个元素两次,这很令人困惑..
  • OP 中给出的数组不正确。你能告诉我们echo '&lt;pre&gt;' . print_r($Allcategories, true) . '&lt;/pre&gt;';的确切输出吗?
猜你喜欢
  • 1970-01-01
  • 2012-01-31
  • 2021-06-19
  • 1970-01-01
  • 2023-02-04
  • 1970-01-01
  • 2014-03-20
  • 2015-05-06
  • 2012-01-27
相关资源
最近更新 更多