【问题标题】:Simple Foreach loop with tricky situation具有棘手情况的简单 Foreach 循环
【发布时间】:2016-11-18 23:10:55
【问题描述】:

我发现这个问题非常具有挑战性。我有一个看起来像这样的 foreach 循环。

<ul class="menu">
<li class="menu1"><a href="#"><?php echo $records[0]['olt_name'] ?></a>
        <ul class="menu">
            <?php
            $unique = array();
            foreach($records as $r)
            {
                $a = substr($r['pon_port'],2,1);
                if(!in_array($a, $unique)) {
                    $unique[] = $a;
                    echo '<li class="menu1"><a href="#">' . $a . '</a>'; //slots
                }

             ------->>>>>> echo '<ul class="menu">';
echo'<li class="menu1"><a href="#">'.substr($r['pon_port'],4,1).'</a></li>';

                        echo '</ul>';
            }

            echo '</li>';
            ?>
        </ul>
</li>
</ul>

我想要实现的是这样的列表项:

<ul>
<li><a href="#"> Level 1 </a>
<ul>
<li><a href="#"> Level 1.1 </a>
    <ul>
    <li><a href="#"> Level 1.1.1 </a></li>
    <li><a href="#"> Level 1.1.2 </a></li>
    <li><a href="#"> Level 1.1.3 </a></li>
    <li><a href="#"> Level 1.1.4 </a></li>
    </ul>
</li>
</ul>

现在我面临一个棘手的情况。我用箭头显示的&lt;ul&gt; 的开头因为foreach 每次都在循环。所以每次循环运行时都是这样的:

<ul><li></li><ul> 
<ul><li></li><ul>

我不希望&lt;ul&gt;&lt;/ul&gt; 每次都循环播放。有没有办法输入一次&lt;ul&gt;,下次循环运行时不要输入。每次循环运行时只输入&lt;li&gt;

这是 $records 的转储。

array(24) { [0]=> array(2) { ["pon_port"]=> string(5) "0/0/4" ["olt_name"]=> string(8) "BRT-OLT1" } 
[1]=> array(2) { ["pon_port"]=> string(5) "0/0/3" ["olt_name"]=> string(8) "BRT-OLT1" } 
[2]=> array(2) { ["pon_port"]=> string(5) "0/0/1" ["olt_name"]=> string(8) "BRT-OLT1" } 
[3]=> array(2) { ["pon_port"]=> string(5) "0/0/5" ["olt_name"]=> string(8) "BRT-OLT1" } 
[4]=> array(2) { ["pon_port"]=> string(5) "0/0/2" ["olt_name"]=> string(8) "BRT-OLT1" } 
[5]=> array(2) { ["pon_port"]=> string(5) "0/0/6" ["olt_name"]=> string(8) "BRT-OLT1" } [6]=> array(2) { ["pon_port"]=> string(5) "0/0/7" ["olt_name"]=> string(8) "BRT-OLT1" } 

【问题讨论】:

  • 你能显示 $records 的转储和你预期的结果吗?了解更多
  • 我不明白为什么你需要&lt;ul&gt; 在循环中。您想要的输出只是在循环打印的所有&lt;li&gt; 之前。
  • 当你使用substr($r['pon_port'],4,1) 时,你如何得到Level 1.1.1 之类的东西?那应该只在锚文本中放置一个字符。
  • @karthik N 我已经更新了问题。
  • @barmar 这只是一种格式。我只想显示一个数字。我没有得到什么负面标记?我认为这个问题是一个棘手的问题,每个人都会有机会学习。我的问题是不是无法理解>>??

标签: php html arrays loops foreach


【解决方案1】:

用一个变量来表示是否是第一次循环。

$unique = array();
$first = true;
foreach ($records as $r) {
    $a = substr($r['pon_port'],2,1);
    if(!in_array($a, $unique)) {
        $unique[] = $a;
        echo '<li class="menu1"><a href="#">' . $a . '</a></li>'; //slots
    }
    if ($first) {
        echo "<ul>";
        $first = false;
    }
    echo'<li class="menu1"><a href="#">'.substr($r['pon_port'],4,1).'</a></li>';
}
if (!$first) {
    echo "</ul>";
}

DEMO

【讨论】:

  • 抱歉没有帮助。
  • 仅当所有 substr($r['pon_port'],4,1) 为 0 时才有效。如果它的值为 1 则不起作用。查看演示ideone.com/6yuplO
  • 当值为 1 时应该有什么不同?这个问题没有任何意义。
  • 顺便说一句,您缺少 if (!in_array) 块内的 &lt;/li&gt;。我将其添加到我的答案中并制作了一个新的演示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
相关资源
最近更新 更多