基于第一个字母的CakePHP中的组记录?

时间:2012-02-26 15:16:06

标签: cakephp cakephp-2.0 cakephp-appmodel

我想要通过第一个字母从数据库表中获取和分组记录。例如:

  

A
  阿尔弗雷德

     


  布赖恩

     

C
  克里斯托弗

     

...

理想情况下,我希望我的数据结构如下:

Array
(
    [A] => Array
    (
        [0] => Array
        (
            [Person] => Array
            (
                [id] => 12
                [name] => Alfred
            )
        )
    )
)

我可以使用原始MySQL查询执行此操作,但不确定CakePHP是否支持此开箱即用。我只是想要分组记录,所以我可以迭代它们并为每个字母创建一个无序列表:

<h2>A</h2>
<ul>
  <li>Alfred</li>
</ul>
<h2>B</h2>
<ul>
  <li>Brian</li>
</ul>
<h2>C</h2>
<ul>
  <li>Christopher</li>
</ul>
...

2 个答案:

答案 0 :(得分:0)

我要做的是:按名称排序,然后循环排序:

$people = $this->Person->find('all', array(
    'order' => 'Person.name ASC'
));

然后你可以这样做:

$letter = '';
foreach($people as $person) {
    $firstLetter = strtolower(substr($person['Person']['name'], 0, 1));
    if ($firstLetter !== $letter) {
        $letter = $firstLetter;
    }
    $_people[$letter][] = $person;
}
$people = $_people;

或者直接在视图中执行此操作,因此您无需将其循环两次:

<ul>
<?php $letter = 'first'; ?>
<?php foreach ($people as $person) : ?>
    <?php $firstLetter = strtolower(substr($person['Person']['name'], 0, 1)); ?>
    <?php if ($firstLetter !== $letter) : ?>
        <?php if ($letter !== 'first') : ?>
            </ul></li>
        <?php endif; ?>
        <?php $letter = $firstLetter; ?>
        <li><h2><?php echo $firstLetter; ?></h2><ul>
    <?php endif; ?>
    <li><?php echo $person['Person']['name']; ?></li>
<?php endforeach; ?>
</ul></li></ul>

我不知道如何通过使用find调用来获取此结构(除了进行26次调用或创建包含所有字母的db表之外),我不明白为什么这将是neccesairy。

希望有所帮助! (ps代码没有经过测试......但是你明白了。如果有任何拼写错误)

答案 1 :(得分:0)

试试这个:

$peoplebyletter = array();

foreach($people as $person){
    $peoplebyletter[strtolower(substr($person['Person']['name'], 0, 1))][] = $person;
}

debug($peoplebyletter);

未经测试。如果有效,请告诉我。