Smarty - Php-Arrays zweispaltig anzeigen (foreach/section)
8. November 2008 | 17:59:34
Als praktisches Beispiel dient meine alle Artikel anzeigen -Seite. Hier wollte ich nicht einfach nur die Titel der Artikel untereinander schreiben, sondern per float:left zwei Spalten (divs) erzeugen, die dann den jeweiligen Inhalt aufnehmen. Der Inhalt kommt wieder aus einer Datenbank und wird in ein zwei-dimensionales Php-Array eingelesen.
In der Funktion, die den Datenbankzugriff erledigt, wird das Array wie folgt erzeugt:
Das erzeugte Array hat dabei in etwa folgende Struktur:
Das fertige Array wird dann vom PHP-Skript an das Template übergeben (per assign) und dort mittels foreach und section verarbeitet. Nachfolgend wird das Template skizziert:
Mittels der foreach-Schleife durchlaufen wir die Jahreszahlen (year). Die inneren section-Abschnitte iterieren über dem Array list. Dabei beginnt der erste Abschnitt bei Schritt 0 und der zweite Abschnitt bei Schritt 1. Die Schrittweite beträgt jeweils 2, so dass in der linken Spalte die Array-Elemente mit geraden Indizes und in der rechten Spalte diejenigen mit ungeraden Indizes angezeigt werden.
In der Funktion, die den Datenbankzugriff erledigt, wird das Array wie folgt erzeugt:
/* erzeugen des Arrays */
...
$articles = array();
while( $row = $db->fetch( $res ))
{
$row['title'] = urldecode( $row['title']);
$db_year = $row['year'];
$articles[$db_year]['year'] = $db_year;
$articles[$db_year]['list'][] = $row;
}
...
Das erzeugte Array hat dabei in etwa folgende Struktur:
/* Beispiel-Dump des PHP-Arrays */
Array
(
[2008] => Array
(
[year] => 2008
[list] => Array
(
[0] => Array
(
[id] => 10
[title] => Zehnter Artikel
[date] => 2008-11-02
[comnts] => 10
)
[1] => Array
(
[id] => 9
[title] => Neunter Artikel
[date] => 2008-10-12
[comnts] => 0
)
...
)
[2007] => Array
(
[year] => 2007
[list] => Array
(
[0] => Array
(
[id] => 12
[title] => Zwölfter Artikel
[date] => 2007-12-01
[comnts] => 2
)
...
)
)
Das fertige Array wird dann vom PHP-Skript an das Template übergeben (per assign) und dort mittels foreach und section verarbeitet. Nachfolgend wird das Template skizziert:
{* Template verarbeitet das Titel-Array *}
{* -- ist das Array überhaupt definiert und gefüllt? -- *}
{if isset($summary_list) && $summary_list|@count > 0}
{foreach key=index item=summary from=$summary_list}
{* -- das Jahr ausgeben -- *}
<div>{$summary.year}</div>
<div>
{* -- erste Titelspalte -- *}
<div style="width: 46%; float: left">
{section name=n start=0 loop=$summary.list step=2}
<div>{$summary.list[n].title}</div>
{/section}
</div>
{* -- zweite Titelspalte -- *}
<div style="width: 46%; float: left">
{section name=m start=1 loop=$summary.list step=2}
<div>{$summary.list[m].title}</div>
{/section}
</div>
<div style="clear: left">
</div>
{/foreach}
{/if}
Mittels der foreach-Schleife durchlaufen wir die Jahreszahlen (year). Die inneren section-Abschnitte iterieren über dem Array list. Dabei beginnt der erste Abschnitt bei Schritt 0 und der zweite Abschnitt bei Schritt 1. Die Schrittweite beträgt jeweils 2, so dass in der linken Spalte die Array-Elemente mit geraden Indizes und in der rechten Spalte diejenigen mit ungeraden Indizes angezeigt werden.

