0

次のように、CakePHP で記述されたアプリのトピックのリストを表示しています。

<ul>
    <?php foreach ($topics as $topic): ?>
        <li>
            <?php echo $topic['Topic']['title']; ?>
        </li>
        <?php endforeach; ?>
</ul>

私がやりたいのは、それらを次のように表示することです:

<h3>A</h3>
<ul>
    <li>animals</li>
    <li>anger</li>
    <li>age</li>
</ul>

<h3>B</h3>
<ul>
    <li>bat</li>
    <li>bird</li>
</ul>

etc...

どうすればいいですか?3D などの数値も使用できることを念頭に置いてください。

配列

array(
    (int) 0 => array(
        'Topic' => array(
            'id' => '1',
            'title' => 'awesome'
        ),
        'TopicPost' => array(
            (int) 0 => array(
                'id' => '1',
                'topic_id' => '1',
                'post_id' => '107'
            )
        )
    ),
    (int) 1 => array(
        'Topic' => array(
            'id' => '2',
            'title' => 'amazing'
        ),
        'TopicPost' => array(
            (int) 0 => array(
                'id' => '2',
                'topic_id' => '2',
                'post_id' => '107'
            )
        )
    ),
    (int) 2 => array(
        'Topic' => array(
            'id' => '3',
            'title' => 'jazz'
        ),
        'TopicPost' => array(
            (int) 0 => array(
                'id' => '3',
                'topic_id' => '3',
                'post_id' => '107'
            )
        )
    )
)
4

3 に答える 3

0

私のphpは少し錆びているので、エラーの可能性があることをお詫びしますが、ロジックが明確であることを願っています. これを試すことができます:

    <?php  
        $lastTopic = ' ';
        $first = true;
        $close = false;
        foreach ($topics as $topic): 
            $lastLetter = substr($lastTopic, 0, 1);
            $thisLetter = substr($topic['Topic']['title'], 0, 1);
            $isNewLetter =  $lastLetter == $thisLetter;
            if ($isNewLetter):
                $close = true;
                if($first) $first = false;
                else echo "</ul>";
    ?>
                <h3><?php echo $newLetter ?></h3>
                <ul>
                <?php endif; ?>
                    <li>
                        <?php 
                            echo $topic['Topic']['title']; 
                            $lastTopic = $topic['Topic']['title']; 
                        ?>
                    </li>

         <?php endforeach; ?>
         <?php if($close) echo "</ul>"; ?>
</ul>

基本的な考え方は、新しい文字で始まるトピックに遭遇するたびに、html リストを閉じて新しいヘッダーを作成するというものです。もちろん、これはリストがすでにソートされていることを前提としています。

于 2012-04-15T23:20:59.493 に答える
0

あなたがする必要があるのは、最初にあなたがforeach通過できるソートされたアイテムの配列を作成することです. この配列を作成するときは、各トピックの最初の文字を取得し、同じ文字または番号を持つトピックのリストを作成します。

これが$topic等しいとすると:

$topic = array(
    (int) 0 => array(
        'Topic' => array(
            'id' => '1',
            'title' => 'awesome'
        ),
        'TopicPost' => array(
            (int) 0 => array(
                'id' => '1',
                'topic_id' => '1',
                'post_id' => '107'
            )
        )
    ),
    (int) 1 => array(
        'Topic' => array(
            'id' => '2',
            'title' => 'amazing'
        ),
        'TopicPost' => array(
            (int) 0 => array(
                'id' => '2',
                'topic_id' => '2',
                'post_id' => '107'
            )
        )
    ),
    (int) 2 => array(
        'Topic' => array(
            'id' => '3',
            'title' => 'jazz'
        ),
        'TopicPost' => array(
            (int) 0 => array(
                'id' => '3',
                'topic_id' => '3',
                'post_id' => '107'
            )
        )
    )
);

次のコードを使用して、配列を処理できます。

<?
foreach($topic as $currentTopic):
    $thisLetter = strtoupper($currentTopic['Topic']['title'][0]);
    $sorted[$thisLetter][] = $currentTopic['Topic']['title'];
    unset($thisLetter);
endforeach;

foreach($sorted as $key=>$value):

    echo '<h3>'.$key.'</h3>';
    echo '<ul>';

    foreach($value as $thisTopic):
        echo '<li>'.$thisTopic.'</li>';
    endforeach;

    echo '</ul>';

endforeach;
?>

これは正常にテストされました。

于 2012-04-15T23:34:00.903 に答える
-1

これらのコードを試してください:

<ul style="list-style-type:upper-alpha">
  <?php foreach ($topics as $topic): ?>
    <li>
        <?php echo $topic['Topic']['title']; ?>
    </li>
    <?php endforeach; ?>
</ul>
于 2012-04-15T22:59:45.587 に答える