dedlfix: Mehrere Vorkommen eines Strings in einem Array

Beitrag lesen

echo $begrüßung;

ich habe ein zweidimensionales Array, in dessen erstem Array Namen stehen und im zweiten ein dem Namen zugeordnetes Datum.
Ein Name kann aber in dem ersten Array auch mehrmals vorkommen, allerdings mit einem anderen Datum im zweiten Array.

Also z.B.

$test_arr[0][0] = "Max Mustermann";

$test_arr[0][1] = "Anna Mustermann";
$test_arr[0][2] = "Max Mustermann";


>   
> Dazu dann  
> ~~~php

$test_arr[1][0] = "1.2.";  

> $test_arr[1][1] = "2.2.";  
> $test_arr[1][2] = "3.2.";

Jetzt will ich aus diesem Array eine Tabelle erstellen, in der in der ersten Spalte der Name steht und in den weiteren Spalten alle zugehörigen Daten.

Dazu kannst du deine Daten einerseits nach den Namen sortieren, so dass gleiche Namen hintereinander stehen, und anschließend mit einem so genannten Gruppenwechsel bei der Ausgabe arbeiten. Beim Sortieren des ersten Arrays solltest du die Schlüssel-zu-Wert-Zuordnung beibehalten und anschließend mit foreach (... as $key => $value) darüber laufen. Dann kannst du über den Key auf den Key des Datums im zweiten Feld zugreifen. Wenn sich bei einem Schleifendurchlauf der Name zum vorhergehenden Durchlauf ändert, hast du den Wechsel und schließt die eine Zeile ab und eröffnest die nächste. Diese Vorgehensweise hat den Nachteil, dass du am Ende eine offene Zeile übrig hast oder aber stets testen musst, ob du am Ende angelangt bist.

Die zweite Möglichkeit ist das Umsortieren nach Felix' Vorschlag. Seine Aussage, dass sich Werte mit Sonder- und Leerzeichen nicht als Schlüssel eignen, ist nicht richtig, denn als Key kann jeder Integer-Wert und String ohne weitere Einschränkungen verwendet werden.

Deshalb kann man das Array mit einfacherer Struktur erzeugen:

$array = (  
  'Max Mustermann' => array('1.2.', '3.2.'),  
  'Anna Mustermann' => array('2.2'));

Das Umsortieren in diese Form ist nicht sehr schwer. Bei jedem Namen aus Array 1 wird mit isset() nachgeschaut, ob er schon als Key existiert und dann das Datum an das Array angefügt. Wenn nicht, ist ein neues Array mit dem Datum als Element zu erstellen.

Einen sich wiederholenden Text mit Array-Werten dazwischen zu erstellen kann man mit implode() erledigen. Ein

implode('</td><td>', $werte_array)

ergibt

wert 1</td><td>wert 2</td><td>wert 3 usw.

An den Anfang ein <td> und ans Ende ein </td> und fertig ist der Zeileninhalt. Nicht ganz, denn in deinem Fall muss noch eine Zelle mit dem Namen vorndran und gegebenenfalls müssen auch noch Leerzellen angehängt werden, deren Anzahl sich aus der Differenz der Anzahl der Datumswerte und einer von dir festgelegten Spaltenanzahl ergibt. Mit str_repeat() lassen sie sich ohne großen Aufwand erzeugen. Den fertigen Zeileninhalt kannst zu in einem weiteren Array zwischenablegen, das du auf die gleiche Weise mit implode() zur fast fertigen Tabelle zusammenbauen lassen kannst.

$pos1 = array_search($name, $test_arr[0]);
if ($pos1!=false) {

Das ist nicht richtig, denn auch der Wert 0 entspricht beim Vergleichen einem false. Ein typenechter Vergleich mit !== führt zum Ziel. Ansonsten ist der Code leider wieder einer aus der Kategorie "unkommentierter Codehaufen". Du tust dir und allen anderen, die das Notierte lesen sollen, keinen Gefallen, wenn du nicht dazu schreibst, was es bezweckt. Aus einem Code selbst auf seine Aufgabe und seine Wirkungsweise zu schließen ist nicht unbedingt erbauend und dürfte bei den wenigsten Programmierern zu deren Lieblingstätigkeiten zählen, besonders nicht, wenn er nicht fehlerfrei ist.

Bei jedem Code, der sich wiederholt ist es überlegenswert, ob man nicht die ewig gleichen Teile in eine Funktion auslagert und nicht x Mal hinschreibt. Bei einer Änderung muss man nur die Funktion anpassen und nicht zig Kopieen.

echo "$verabschiedung $name";