1unitedpower: Brauche Idee, für Titel Ausgabe bei einer SELECT abfrage, Ausgabe, gruppierte Var, dann Titel

Beitrag lesen

eine Template-Engine ist eine ganz andere Sache, in dem Fall sollte man die Daten tatsächlich vorab in einem Array sammeln. Aber gut überlegen, wieviele Zeilen man da aufbereitet, um den Speicher nicht zu sehr zu stressen.

Da muss man mit PHP und PDO sowieso aufpassen: wenn man gepufferte Querys verwendet (PHPs Standardeinstellung), dann wird das gesamte Resultset in den Speicher geladen.

Eine Möglichkeit den Speicherbedarf zu reduzieren sind ungepufferte Queries. Dann sollte man aber auch kein fetchAll verwenden, das würde nur wieder dazu führen, dass alles in den Speicher geladen wird.

Das kann mit trägen Datenstrukturen wie Iteratoren vermeiden. Dein Algorithmus in PHP übersetzt, würde dann zu so etwas werden (ungetestet):

function groupBy(Traversable $rows, string $col) : Iterator {
   $it = new IteratorIterator($rows);
   while ($it->valid()) {
       yield slice($it, $col);
   }
}

function slice(Iterator $it, string $col) : Iterator {
   $row = $it->current();
   $cat = $row[$col];
   while ($it->isValid() && $row[$col] == $cat) {
       yield $row;
       $it->next();
       $row = $it->current();
   }
}

Und benutzen ließe es sich so:

$query->execute();
$categories = groupBy($query, 'cat');
foreach ($categories as $category) {
    // Kategorie-Kopf ausgeben
    foreach ($category as $entry) {
        // Zeile ausgeben
    }
}

Wenn alle Zeilen einfach ausgegeben werden, wie in diesem Beispiel, dann müsste man auch dafür sorgen, dass der Output-Buffer zwischendurch geflusht wird. Ansonsten hat man schon wieder ein Speicherproblem.

Bleibt noch zu sagen, dass diese Optimierung nicht umsonst ist, hier wird Speicherdarf gegen Rechnzeit getauscht. Normalerweise ist Speicher aber günstiger als Rechenleistung, deshalb lohnt sich so eine Optimierung meistens nicht.