Rolf B: bestimmtes array ausgeben

Beitrag lesen

Hallo Michael,

Aber ich glaube ich mache das zu kompliziert

nein, nicht wirklich. Es gibt keine PHP-Funktion, die Dir die benötigte Funktionalität fertig liefert. array_filter wäre eine Möglichkeit, aber das ist für den Anwendungsfall viel zu ineffizient (es durchläuft das ganze Array und produziert ein neues Array).

Deinen Code würde ich in folgenden Punkten als verbesserungsfähig ansehen:

  • man trennt nach Möglichkeit Logik und Ausgabe. Dann kann man die Logik wiederverwenden
  • es gibt bessere Möglichkeiten, ein Array zu durchlaufen
  • Suchschleifen bricht man beim Treffer ab

Aber: Bevor man Code optimiert, prüft man die verwendeten Datenstrukturen. Damit kann man oft mehr gewinnen. Der einfachste Ansatz wäre nämlich, dein $ausgabe-Array anders zu erzeugen. Du könntest die ID als Key verwenden, dann kannst Du auf $ausgabe[1] zugreifen und brauchst überhaupt keine Suche mehr. Ob das geht, hängt natürlich von deinem übrigen Programm ab und davon, ob die ID-Spalte eindeutige Werte enthält.

Wenn Du die Erzeugung von $ausgabe nicht beeinflussen kannst oder willst, dann könntest Du es auch nachträglich in die Index-Form umbauen (mich wundert gerade, dass PHP sowas wie array_indexBy nicht mitbringt; ich finde nichts passendes...). Das lohnt aber nur, wenn Du das Ergebnis öfter brauchst, andernfalls ist das ineffizient.

// Für deine Funktionensammlung
function array_indexBy($array, $keyCol) {
   $result = [];
   foreach ($array as $entry)
      $result[$entry[$keyCol]] = $entry;
   return result;
}

// Da, wo Du die Ausgabe durchführst
$ausgabe = array_indexBy($ausgabe, 'id');
if (isset($ausgabe[1]))
   echo "<h1>{$ausgabe[1]['inhalt']}</h1>";

Edit: Den von 1UP bemerkten Fehler korrigiert.

Wenn Du die Existenz von ID 1 garantieren kannst, ist der isset Test nicht nötig.

Wenn Du das Array nicht umbauen kannst oder willst, kannst Du alternativ folgendes tun:

  • Suchlogik und Ausgabe trennen
  • die Suchschleife als foreach eleganter formulieren und bei Treffer sofort verlassen

Ersteres ist deshalb wichtig, weil ich annehmen würde, dass Du auch noch andere Anlässe hast, in einem Array dieser Art nach einer ID zu suchen. Letzteres dient der Performance.

$ausgabeZeile = findeAusgabeId($ausgabe, 1);
if ($ausgabeZeile !== FALSE) {
   echo "<h1>{$ausgabeZeile['inhalt']}</h1>";
}

// und in deiner Funktionensammlung:
function findeAusgabeZeile($ausgabe, $id) {
   foreach ($ausgabe as $zeile) {
      if ($zeile['id'] == $id)
         return $zeile;
   }
   return FALSE;
}

Letztendlich könnte man diese letzte Funktion auch allgemeingültig formulieren; wundert mich eigentlich dass PHP sowas nicht an Bord hat...

function array_findSubkey($array, $subKey, $value) {
   foreach ($array as $row) {
      if (isset($row[$subKey]) && $row[$subKey] == $value)
         return $row;
   }
   return FALSE;
}

// Aufruf:
$ausgabeZeile = array_findSubkey($ausgabe, 'id', 1);

Eine noch allgemeinere Variante wäre eine Implementierung von array_search mit einer Callback-Funktion; das lass ich jetzt mal 😀

Rolf

--
sumpsi - posui - clusi