2012-02-26 10 views
1

私は最初の文字でデータベーステーブルからレコードを取り出してグループ化したいと思っています。ですから、例えば:最初の文字に基づいてCakePHPのレコードをグループ化しますか?


アルフレッド

B
ブライアン

C
クリストファー

...

私は生のMySQLのクエリでこれを行うことができ

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

が、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> 
... 
+0

[[名前の最初の文字のグループPHPの結果](http://stackoverflow.com/questions/6760222/group-php-results-on-first-letter-of-name)の可能な複製 –

答えて

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テーブルの作成を除く)を使用するだけで、この構造を取得する方法はわかりません。なぜそれが必要かはわかりません。

希望に役立ちます! (psのコードがテストされていません...しかし、あなたはポイントを得る任意のタイプミスがあるはずです)

0

これを試してみてください:

$peoplebyletter = array(); 

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

debug($peoplebyletter); 

テストされていません。それが動作するかどうか私に教えてください。

関連する問題