php foreach [类别倾斜显示每个文本列表,甚至来自同一类别]

时间:2015-02-21 13:29:22

标签: php foreach

抱歉这个非常简单的php问题。

我在php中有一个网站,想要回显类别和文本列表。 当我写这样的东西时......

<?php foreach ($reports as $report): ?>   
<h3><?php echo h($report["category_title"]); ?></h3>  
<ul>
  <li><?php echo h($report["text"]); ?></a></li>
</ul> 
<?php endforeach; ?>

它向我显示了这样的事情......

类别标题1

文字1

类别标题1

文字2

类别标题2

文字3

类别标题2

文字4

我的问题是如何将其显示为......

类别标题1

文字1

文字2

类别标题2

文字3

文字4

如果有人可以帮助我,我会感激不尽。

谢谢。

3 个答案:

答案 0 :(得分:1)

您可以使用ouzo-goodies使用替代解决方案。 Arrays::groupBy方法:

$reports = Arrays::groupBy($reports, Functions::extract()->category_title);
foreach ($reports as $category => $report) {
    echo '<h3>' . $category . '</h3>';
    echo '<ul>';
    foreach ($report as $element) {
        echo '<li>' . $element['text'] . '</li>';
    }
    echo '</ul>';
}

结果:

<h3>category1</h3>
<ul>
<li>title1</li>
<li>title2</li>
</ul>
<h3>category2</h3>
<ul>
<li>title1</li>
<li>title2</li>
</ul>

答案 1 :(得分:0)

您可以定义名为$currentCat的变量,并检查类别标题是否更改:

<?php 
$currentCat = false;
foreach ($reports as $report):
    if ($currentCat !== $report[category_title]):
        if ($currentCat)
            echo '</ul>';
?>   
<h3><?php echo h($report[category_title]); ?></h3>
<ul>
<?php
        $currentCat = $report[category_title];
    endif;
?>
<li><?php echo h($report["text"]); ?></a></li>
<?php endforeach;

if ($currentCat)
        echo '</ul>';
?> 

答案 2 :(得分:0)

这里的问题似乎在于如何存储数据。我假设您的$报告就像这样

$reports = [
    ['category_title' => 'Category title 1', 'text' => 'text 1'],
    ['category_title' => 'Category title 1', 'text' => 'text 2'],
    ['category_title' => 'Category title 2', 'text' => 'text 1'],
    ['category_title' => 'Category title 2', 'text' => 'text 2'],
];

您不应该复制category_title信息。你的$ reports var应该是这样的。

$reports = [
    ['category_title' => 'Category title 1', 'texts' => ['text 1', 'text 2']]
    ['category_title' => 'Category title 2', 'texts' => ['text 1', 'text 2']]
];

您可以像这样从一个数组转换为另一个数组。

$new_reports = [];
foreach ($reports as $report) {
    if(!isset($new_report[$report['category_title']])) {
        $new_report['category_title'] = [];
    }
    $new_report['category_title'] []= $report['text'];
}