Wie kann ich zwei 2-dimensionale arrays spaltenweise verbinden?
cygnus
- php
Hallo :)
Ich möchte den Inhalt zweier includierter Dateien (zweidimensionale arrays) spaltenweise in einer Tabelle zusammenführen.
array_merge ist ungeeignet, da die Inhalte dann untereinander angezeigt werden.
Ich habe also Unterschiedliches ausprobiert, das bisher aussagekräftigste
Ergebnis
ist hier zu sehen.
Leider hat es eine Macke: Der Inhalt beschränkt sich nicht auf drei Zeilen, wie gewollt, sondern zeigt auf 9 Zeilen einen verdreifachten Inhalt.
Gibt es eine Funktion, die das wie gewünscht vereinigt?
Oder ist im Code ein Fehler, der diese Verdreifachung erzeugt?
Vielleicht kann man nicht mit zwei foreach-Schleifen arbeiten, sondern muss eine andere Lösung finden?
Hier der code:
include ("inc/data.inc.php");
foreach($data as $ausgabe)
{list($spalte1, $spalte2,) = $ausgabe;
include ("inc/zugabe.inc.php");
foreach ($zugabe as $ausgabe)
{list($spalte3, $spalte4,) = $ausgabe;
echo "\n\n<tr><td class='nr'>" , ++$count , "</td>\n<td class='blau'>";
echo $spalte1 , "</td>\n<td class='blau'>";
echo $spalte2 , "</td>\n<td class='gelb'>";
echo $spalte3 , "</td>\n<td class='gelb'>";
echo $spalte4 , "</td>\n</tr>";
}
}
mfg
cygnus
include ("inc/data.inc.php");
foreach($data as $ausgabe)
{list($spalte1, $spalte2,) = $ausgabe;include ("inc/zugabe.inc.php");
foreach ($zugabe as $ausgabe)
{list($spalte3, $spalte4,) = $ausgabe;echo "\n\n<tr><td class='nr'>" , ++$count , "</td>\n<td class='blau'>";
echo $spalte1 , "</td>\n<td class='blau'>";
echo $spalte2 , "</td>\n<td class='gelb'>";
echo $spalte3 , "</td>\n<td class='gelb'>";
echo $spalte4 , "</td>\n</tr>";}
}
Bitte keine Chaosformatierung im Code.
Warum eine Schleife in der Schleife?
Die Dateien sind schlieslich nebeneinander,
nicht eine Datei im Text der anderen, darzustellen.
~~~php
include ("inc/data.inc.php");
$text1 = $data;
include ("inc/zugabe.inc.php");
$text2 = $zugabe;
$cnt = 0;
while( $cnt<202 ){
# eine Abbruchbedingung
break if(
$text1[$cnt][0] eq '' or
$text1[$cnt][1] eq '' or
$text2[$cnt][0] eq '' or
$text2[$cnt][1] eq ''
);
echo "\n\n<tr>",
" <td class='nr'>" , $cnt , "</td>\n",
" <td class='blau'>" $text1[$cnt][0] , "</td>\n",
" <td class='blau'>" $text1[$cnt][1] , "</td>\n",
" <td class='gelb'>" $text2[$cnt][0] , "</td>\n",
" <td class='gelb'>" $text2[$cnt][1] , "</td>\n",
"</tr>";
# Incrementor am Ende
$cnt++;
}
Keine Ahnung ob das jetzt properes php ist.
mfg Beat;
echo $begrüßung;
include ("inc/data.inc.php");
$text1 = $data;
include ("inc/zugabe.inc.php");
$text2 = $zugabe;
Welchen Sinn hat hier das Umkopieren?
$cnt = 0;
while( $cnt<202 ){
Wieso 202? Und warum while? Mit einem foreach über das eine Array erhält man exakt soviele Durchläufe wie das Array groß ist, weder zu viele noch zu wenige.
# eine Abbruchbedingung
break if(
$text1[$cnt][0] eq '' or
$text1[$cnt][1] eq '' or
$text2[$cnt][0] eq '' or
$text2[$cnt][1] eq ''
);
Das ist kein PHP-Code, scheint mit Perl zu sein. Unter PHP steht das Auszuführende immer nach der Kontrollstruktur (Ausnahme: do-while, aber das hab ich noch nie in freier Wildbahn verwendet gesehen). Für Vergleiche gibt es nur die aus den Zeichen <>=! zusammengesetzten Operatoren und keine "sprechenden".
echo "$verabschiedung $name";
Hallo :)
Bitte keine Chaosformatierung im Code.
Warum eine Schleife in der Schleife?
Die Dateien sind schlieslich nebeneinander,
nicht eine Datei im Text der anderen, darzustellen.
Ich will nicht zählen ... das ist ein Missverständnis.
Ich habe den programmierbaren Overall heute mal zu Hause gelassen und zähle mit ++$count
automatisch in der ersten Reihenzählerspalte nur fortlaufend.
Das Ergebnis 9 Zeilen ergibt sich durch die Verdreifachung des Inhalts.
Es sollen eigentlich nur drei Zeilen werden, wenn alles funktioniert.
Schleife in der Schleife:
Wenn foreach nicht von list gefolgt wird, bekomme ich die Ausgabe von der ersten foreach-Schleife nicht, sondern nur die Ausgabe der zweiten in allen vier Spalten.
mfg
cygnus
echo $begrüßung;
Der Inhalt beschränkt sich nicht auf drei Zeilen, wie gewollt, sondern zeigt auf 9 Zeilen einen verdreifachten Inhalt.
Kein Wunder, denn wenn du zwei for(each)-Schleifen schachtelst, wird die innere bei jedem Schritt der äußeren komplett neu abgearbeitet. 3 äußere mal 3 innere Schritte ergibt 9.
Du möchtest stattdessen, wenn im Array $data die Zeile 1 dran ist, auch die Zeile 1 aus $zugabe behandeln. Wenn $data[2] an der Reihe ist muss dann demzufolge auch $zugabe[2] behandelt werden, usw. usf.
Gibt es eine Funktion, die das wie gewünscht vereinigt?
Es reicht, wenn du die Schlüssel beim foreach über $data mit berücksichtigst und damit auf den korrespondierenden Eintrag in $zugabe zugreifst.
echo "$verabschiedung $name";
Hallo :)
Kein Wunder, denn wenn du zwei for(each)-Schleifen schachtelst, wird die innere bei jedem Schritt der äußeren komplett neu abgearbeitet. 3 äußere mal 3 innere Schritte ergibt 9.
Ja, so etwas habe ich vermutet.
Es reicht, wenn du die Schlüssel beim foreach über $data mit berücksichtigst und damit auf den korrespondierenden Eintrag in $zugabe zugreifst.
Tut mir leid, mit der Antwort kann bei meinem derzeitigen Wissenstand (7. Tag php-Versuche im Alleingang) nichts anfangen.
Könnte ich es, hätte ich wahrscheinlich auch nicht zwei foreach Schleifen verschachtelt.
Wie wird erreicht, dass die Schlüssel von $data mit berücksichtigt werden?
Wo kann ich das nachsehen, bei den array funktionen im php Handbuch (online)?
Und welches array kommt dafür in Frage?
Gibt es dann nur eine foreachschleife und enthält list dann die Aufzählung aller vier auszugebenen Spalten?
mfg
cygnus
Hi,
Wie wird erreicht, dass die Schlüssel von $data mit berücksichtigt werden?
foreach ($data as $key => $val) {
if (isset($zugabe[$key])) echo $zugabe[$key];
}
hast Du denn Zugriff auf die Arrays? Möglicherweise ist eine andere Struktur sinnvoller.
Gruesse, Joachim
echo $begrüßung;
foreach ($data as $key => $val) {
if (isset($zugabe[$key])) echo $zugabe[$key];
Das foreach ist so richtig, aber du wirst nur dreimal die Ausschrift "Array" bekommen, denn die Werte von $zugabe sind wiederum Arrays. Ein Array mit echo auszugeben führt nur zu "Array". var_dump() oder print_r() sind für die Anzeige von Array-Inhalten geeigneter.
echo "$verabschiedung $name";
Hi,
Das foreach ist so richtig, aber du wirst nur dreimal die Ausschrift "Array" bekommen, denn die Werte von $zugabe sind wiederum Arrays. Ein Array mit echo auszugeben führt nur zu "Array". var_dump() oder print_r() sind für die Anzeige von Array-Inhalten geeigneter.
nun ja, das war auch keine genaue Anleitung, sondern nur als Demo gedacht, wie Arrays "parallel" ausgegeben werden können...
Gruesse, Joachim
Hallo :)
Hi,
Wie wird erreicht, dass die Schlüssel von $data mit berücksichtigt werden?
foreach ($data as $key => $val) {
if (isset($zugabe[$key])) echo $zugabe[$key];
}
hast Du denn Zugriff auf die Arrays? Möglicherweise ist eine andere Struktur sinnvoller.
Du meinst, ob das Includieren funktioniert? Ja.
Im Eröffnungsthread ist ein Link auf meine Testseite.
DIe Tabelle zeigt alle Werte aus den beiden includierten Dateien, nur eben dreifach durch die Verschachtelung.
Ich habe jetzt Deinen Code eingesetzt, erhalte aber jetzt nur die Werte der dritten Reihe aus dem array Data, die Tabelle zeigt nur eine Zeile.
Die Werte von Zugabe werden gar nicht angezeigt.
Hier der Code nach der Veränderung:
include ("inc/data.inc.php");
include ("inc/zugabe.inc.php");
foreach($data as $key => $ausgabe) {
if (isset($zugabe[$key])) echo $zugabe[$key];
}
{list($spalte1, $spalte2, $spalte3, $spalte4) = $ausgabe;
echo "\n\n<tr><td class='nr'>" , ++$count , "</td>\n<td class='blau'>";
echo $spalte1 , "</td>\n<td class='blau'>";
echo $spalte2 , "</td>\n<td class='gelb'>";
echo $spalte3 , "</td>\n<td class='gelb'>";
echo $spalte4 , "</td>\n</tr>";
}
Ich lese jetzt die Seite über isset.
mfg
cygnus
echo $begrüßung;
Ich habe jetzt Deinen Code eingesetzt, erhalte aber jetzt nur die Werte der dritten Reihe aus dem array Data, die Tabelle zeigt nur eine Zeile.
Die Werte von Zugabe werden gar nicht angezeigt.
Kein Wunder. Ein foreach läuft über ein Array. Bei jedem Durchlauf wird die unmittelbar danach stehende Anweisung oder der Code innerhalb von { und } ausgeführt. Wenn du danach etwas notierst, dann wird das erst nach dem Ende der Schleife ausgeführt. Die durch foreach gesetzten Variablen, hier $key und $ausgabe, enthalten nach dem foreach die Werte des letzten Durchlaufs.
Hier der Code nach der Veränderung:
foreach($data as $key => $ausgabe) {
if (isset($zugabe[$key])) echo $zugabe[$key];
}{list($spalte1, $spalte2, $spalte3, $spalte4) = $ausgabe;
[...]
}
Ein {}-Block ohne vorhergehendes foreach, if und dergleichen ist nicht sinnvoll und wird so behandelt, als of das { } nicht da stünde.
Das list()-Konstrukt ist in der Form auch nicht sinnvoll, denn $ausgabe enthält ja nur das was in $data steht und nicht plötzlich noch den Inhalt eines anderen Arrays. Aber dazu schrieb ich ja anderenorts bereits etwas.
Bitte stell zum Entwickeln das error_reporting auf E_ALL (und display_errors auf on), damit dir PHP Hinweise anzeigen kann, wenn du auf nicht vorhandene Dinge zuzugreifen versuchst. Mach bitte außerdem zum Fehlersuchen regen Gebrauch von Kontrollausgaben (von Variableninhalten und Ausdrucksergebnissen), um Wunsch und Wirklichkeit miteinander zu vergleichen.
Ich lese jetzt die Seite über isset.
Nix da, isset() prüft ob eine Variable oder ein Wert eines Arrays vorhanden ist.
echo "$verabschiedung $name";
echo $begrüßung;
Es reicht, wenn du die Schlüssel beim foreach über $data mit berücksichtigst und damit auf den korrespondierenden Eintrag in $zugabe zugreifst.
Tut mir leid, mit der Antwort kann bei meinem derzeitigen Wissenstand (7. Tag php-Versuche im Alleingang) nichts anfangen.
Leid tun muss es dir nicht. Wichtig ist, dass du konkret nachhakst, wenn du etwas nicht verstehst. Und das hast du ja gemacht:
Wie wird erreicht, dass die Schlüssel von $data mit berücksichtigt werden?
Wenn es um foreach geht, wäre ein erster Blick auf die Handbuchseite zu foreach nicht verkehrt.
Wo kann ich das nachsehen, bei den array funktionen im php Handbuch (online)?
Handbuch -> Language Reference -> Control Structures -> foreach. Und siehe da, es gibt zwei Syntax-Formen. Eine davon stellt neben dem Wert auch den Schlüssel zur Verfügung.
Und welches array kommt dafür in Frage?
Im Prinzip ist es egal, wenn beide Arrays gleich viel Einträge enthalten. Ansonsten müsstest du sie erst zählen lassen und dann das Array mit den meisten Einträgen verwenden. Vor dem Zugriff auf das andere Array solltest du aber mit isset() prüfen, ob es dort ein korrespondierendes Element gibt.
Gibt es dann nur eine foreachschleife und enthält list dann die Aufzählung aller vier auszugebenen Spalten?
Du benötigst dann nur eine foreach-Schleife. list() benötigst du gar nicht.
Du hättest, so schreibst du im Ausgangsposting, ein zweidimensionales Array (bzw. zwei). Es ist ungünstig, von mehrdimensional zu sprechen, denn so etwas gibt es unter PHP im Prinzip nicht. Stattdessen hast du vielmehr ein Array, das als Werte weitere Arrays enthält. Durch diese Verschachtelung kannst du zwar mehrdimensionale Datenstrukturen abbilden, aber es bleibt am Ende ein Array mit Arrays. Das ist sehr schön zu sehen, bei einer Kontrollausgabe mit print_r() oder var_dump() (vorher noch ein <pre> erhöht die Übersichtlichkeit der Darstellung):
print_r($data);
Du läufst nun durch dein eines Array
foreach ($data as $key => $value)
und erhältst in $value jeweils einen der Werte, und der enthält eins der inneren Arrays. Auf dessen Elemente greifst du nun wie bei Arrays üblich mit $value[0], $value[1] und so weiter zu (wenn es sich um nummerische Schlüssel handelt).
Für den Zugriff auf das passende innere Array in $zugabe kannst du $key als Schlüssel verwenden: $zugabe[$key]. Die einzelnen Werte bekommst du durch Anhängen von [0], [1] usw.
Wenn du wissen willst, was $key enthält, kannst du eine Kontrollausgabe mit var_dump() vornehmen.
echo "$verabschiedung $name";
Hallo :)
Es ist schon geschafft!
Vielen Dank an alle drei, besonders aber an Dedlfix.
Nun plage ich mich seit heute vormittag, und dann ist es so einfach.
Aber man muss ja auch erst viel durchlesen und ausprobieren, um zu merken,
dass es unbrauchbar ist.
Der Code:
<?php
include ("inc/data.inc.php");
include ("inc/zugabe.inc.php");
foreach($data as $key => $value) {
echo "\n\n<tr><td class='nr'>" , ++$count , "</td>\n<td class='blau'>";
echo $value[0] , "</td>\n<td class='blau'>";
echo $value[1] , "</td>\n<td class='gelb'>";
echo $zugabe[$key][0], "</td>\n<td class='gelb'>";
echo $zugabe[$key][1], "</td>\n</tr>";
}
?>
Und das ist das das Ergebnis !
Ich werde demnächst mit nur rund 10 Zeilen Code große Dateien zusammenführen können, das finde ich ausgesprochen beeindruckend!
mfg
cygnus
echo $begrüßung;
Es ist schon geschafft!
Zwei (nicht gestellte) Fragen aber bleiben noch offen. Warum teilst du die Daten überhaupt auf zwei Arrays und zwei Dateien auf, denn wenn du sie derat zusammenführst, scheinen sie mir doch zusammenzugehören.
<td class='blau'>
<td class='gelb'>
Für eine Klassifizierung (dafür steht ja das class) eine Formatierungseigenschaft zu nehmen ist nicht sehr günstig. Wenn dir später mal einfällt, der Seite eine andere Optik zu verpassen, stehst du da mit deinem nicht mehr stimmenden Klassennamen. Nimm doch besser etwas, das sich an der Art der Daten orientiert.
echo "$verabschiedung $name";
Hallo :)
Zwei (nicht gestellte) Fragen aber bleiben noch offen. Warum teilst du die Daten überhaupt auf zwei Arrays und zwei Dateien auf, denn wenn du sie derat zusammenführst, scheinen sie mir doch zusammenzugehören.
Bisher hatte ich eine html Tabelle und einen entsprechend massigen und unübersichtlichen Code, den man hinterher nicht mehr anzurühren wagte.
Dann habe ich den Inhalt dieser Tabelle zeilenweise in arrays gefüllt und über php in eine Tabelle übertragen lassen.
Es ist noch aber einfacher, jede Datei für sich zu erstellen, weil ich mehrere Dateien wahlweise miteinander kombinieren möchte, je nach Bedarf.
Ich habe eine HP-Seite, die den Inhalt der Datei Data und der Datei Zugabe parallel stellen soll und dadurch einen Vergleich von Zeile zu Zeile möglich macht.
Ich möchte aber die Möglichkeit haben, die Datei Zugabe gegen eine weitere Datei auszutauschen und diese auf einer anderen HP-Seite wiederum mit der Datei data parallel zu stellen. Es geht darum, Textabschnitte zu vergleichen.
Im Grunde genommen würde ich inzwischen gern auf möglichst einfache Weise noch eine dritte Datei mit arrays anhängen, um drei Zeilen vergleichen zu können, also so:
Datei Data | Datei zugabe 1 | Datei zugabe 2 |
Das scheint aber mit diesen einfachen Schritten nicht mehr möglich zu sein.
Ich bin aber auch mit der jetzt gefundenen Lösung zufrieden, es erleichtert die Darstellung enorm.
<td class='blau'>
<td class='gelb'>Für eine Klassifizierung (dafür steht ja das class) eine Formatierungseigenschaft zu nehmen ist nicht sehr günstig.
[...]
Nimm doch besser etwas, das sich an der Art der Daten orientiert.
Ja, das ist gut. Aber für die Testseite war das jetzt die übersichtlichste Form.
mfg
cygnus
echo $begrüßung;
Im Grunde genommen würde ich inzwischen gern auf möglichst einfache Weise noch eine dritte Datei mit arrays anhängen, um drei Zeilen vergleichen zu können, also so:
Datei Data | Datei zugabe 1 | Datei zugabe 2 |
Das scheint aber mit diesen einfachen Schritten nicht mehr möglich zu sein.
Warum nicht? Es ist das selbe Prinzip. Mit dem Key der einen foreach-Schleife kannst du auf beide Zugaben-Arrays zugreifen, solange sie alle immer die gleichen Schlüsselwerte haben.
echo "$verabschiedung $name";
Hallo :)
Warum nicht? Es ist das selbe Prinzip. Mit dem Key der einen foreach-Schleife kannst du auf beide Zugaben-Arrays zugreifen, solange sie alle immer die gleichen Schlüsselwerte haben.
Anfängerfehler ...
Ich hatte es schon genau so ausprobiert, und es ging nicht.
Jetzt habe ich es noch mal probiert und merke, dass ich bei dem 2. Zugaben array das Dollarzeichen vor key vergessen hatte.
Und nun geht es doch :)
mfg
cygnus
echo $begrüßung;
Jetzt habe ich es noch mal probiert und merke, dass ich bei dem 2. Zugaben array das Dollarzeichen vor key vergessen hatte.
Dann stell doch nun das error_reporting auf E_ALL, das weist dich unter anderem auf solche Fehler hin.
Voraussetzung in dem Fall wäre jedoch, dass du das key ohne Anführungszeichen da stehen hättest. PHP gibt dann eine Notice-Meldung aus, die sich darüber beklagt, dass es keine Konstante dieses Namens finden konnte und nun von einem Stringwert ausgeht. Diese Meldung wäre zwar vielleicht verwirrend für dich gewesen, aber dann hättest du möglicherweise noch mal genauer hingeschaut und den fehlenden Dollar gesehen.
Mitunter sieht man ja den von Anfängern gern übernommenen Unsinn, Variablennamen anführungszuzeichnen. Ohne das $ wäre daraus ein normaler String geworden und PHP hätte nichts zu beanstanden gehabt.
Hier mal alle Möglichkeiten (die mir grad einfallen)
$array[key] - falsch, wenn key keine definierte Konstante ist.
$array['key'] - key ist ein als solcher gekennzeichneter String
$array["key"] - dito.
$array[$key] - $key ist eine Variable
$array["$key"] - Unfug. Ergibt nichts anderes als $array[$key], das aber mit mehr Parser-Aufwand
$array['$key'] - ein String. $key wird zwischen einfachen Anführungszeichen nicht als Variable erkannt
Das error_reporting lässt sich auf mehrere Arten aktivieren.
echo "$verabschiedung $name";
Hallo,
<?php
include ("inc/data.inc.php");
include ("inc/zugabe.inc.php");foreach($data as $key => $value) {
echo "\n\n<tr><td class='nr'>" , ++$count , "</td>\n<td class='blau'>";
echo $value[0] , "</td>\n<td class='blau'>";
echo $value[1] , "</td>\n<td class='gelb'>";
echo $zugabe[$key][0], "</td>\n<td class='gelb'>";
echo $zugabe[$key][1], "</td>\n</tr>";}
?>
wenn du dir jetzt noch gleich von Anfang an angewöhnst, Blockstrukturen (Schleifen, if-Anweisungen u.ä.) einzurücken, so dass du die Programmstruktur auch visuell gleich erkennen kannst, machst du nicht nur potentiellen Helfern, sondern auch dir selbst das Leben leichter.
Schönen Sonntag noch,
Martin
--
[Gott hilft niemandem](http://forum.de.selfhtml.org/?t=134084&m=869527), er erfreut sich nur an unseren Leiden.
(Ashura)
Hi Martin,
wenn du dir jetzt noch gleich von Anfang an angewöhnst, Blockstrukturen (Schleifen, if-Anweisungen u.ä.) einzurücken, so dass du die Programmstruktur auch visuell gleich erkennen kannst, machst du nicht nur potentiellen Helfern, sondern auch dir selbst das Leben leichter.
Ansichtssache, ich mache es genau so und wollte das dann irgend wann mal ändern so wie deine Fraktion das wünscht.
Aber gerade bei verschachtelten Schleifen wird die Zeile im Editor immer kürzer, was sich dann entweder dadurch zeigt das Strings in die nächste Zeile springen oder wenn ich den Zeilenumbruch im Editor weglasse, ich ewig nach rechts zu scrollen habe. So habe ich es dann wieder aufgegeben und bin zur alten Prozedur, alles links, zurück.
Hans