在PHP中我应该使用哪个循环来嵌套无序列表?

时间:2016-05-20 04:37:54

标签: php loops

我在PHP应用程序中有以下HTML,其中包含一个包含Group和Items的数组。首先,我想按组对它们进行排序,然后在组中将项目分隔为逗号(Item1,Item2,Item3),而不使用逗号结尾。

<dl>
    <?php $groupname = '' ?>
    <?php foreach ($product['product_filters'] as $product_filter) { ?>
        <?php if ($groupname != $product_filter['group']) { ?>
            <?php $groupname = $product_filter['group']; ?>
            <?php echo '<dd>' . $product_filter['group'] . '</dd>'; ?>
        <?php } ?>
        <dt>
            <?php echo $product_filter['name']; ?>
        </dt>
    <?php } ?>
</dl>

我希望得到以下结果,但我不知道如何管理它以及我应该使用哪个循环:

Group 1
    G1_Item_1, G1_Item_2
Group 2
    G2_Item_1, G2_Item_2, G2_Item_3

1 个答案:

答案 0 :(得分:1)

您可以使用两个循环:一个用于将数据重组为组,另一个用于以所需格式输出数据。请注意,您使用了相反意义上的<dt><dd>:组是标题,因此请使用<dt>

此外,如果您不打开和关闭每一行的php标记,您的代码就会变得更具可读性。尝试制作没有这种中断的代码块:它会使它更具可读性。

以下是建议的代码:

<?php
// Create a new structure ($groups): one entry per group, keyed by group name 
// with as value the array of names:
foreach ($product['product_filters'] as $product_filter) {
    $groups[$product_filter['group']][] = $product_filter['name'];
}
// Sort it by group name (the key)
ksort($groups);
// Print the new structure, using implode to comma-separate the names
foreach ($groups as $group => $names) {
    echo "<dt>$group</dt><dd>" . implode(', ', $names) . "</dd>";
}
?>

eval.in上看到它。