php mehrdimensionales Array in String konvertieren
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
beispiel
code
datei
ende
ergebnis
file
flag
funktion
kombinieren
performance
schleife
schleifen
string
test
text
textdatei
url
zeile
ziel
-
Hallo,
ich habe eine Schleife, die eine andere schleife beinhaltet. Die zweite Schleife mischt verschiedene Textdateien Zeile für Zeile zusammen. Die erste Schleife lässt das so lang durchlaufen, bis alle Einträge in der Textdatei mindestens einmal vorkommen.
das ganze sieht am Ende so aus:
(Bitte beachten, dass testfile3 mit Absicht eine leere Datei ist, um das auszuprobieren. Demnach sind im "echo $test" nur zwei einträge, ein Komma und ein Zeilenumbruch.
$data = array(); $data[0] = file($testfile1); $data[1] = file($testfile2); $data[2] = file($testfile3); if(!empty($data)){ for($k=0;$k<$anzahl;$k++){ for($loop = 0;$loop < count($data)-1;$loop++){ $test = $data[$loop][$k]; echo $test; //$textdatei = fopen ($this->createentry, "w+"); //fwrite($textdatei, $text); //fclose($textdatei); } echo '<br>'; } }
Wie kann ich das mehrdimensionale $test-array in einen String konvertieren? Das ganze muss innerhalb der zweiten For schleife geschehen, damit die Texteinträge nicht vergeigt werden ^^ -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Was hast du denn mit dem String vor?
An sich kannst du vorher sowas machen wie
und dann hast du innerhalb der for-Schleifen einfach$myString = '';
$myString .= $test;
Liebe Grüße -
ggamee schrieb:
Was hast du denn mit dem String vor?
An sich kannst du vorher sowas machen wie
und dann hast du innerhalb der for-Schleifen einfach$myString = '';
$myString .= $test;
Liebe Grüße
Ok das funktioniert schonmal... Nun hab ich das Problem, das ich beim erstellen der Dateien, die nun gemixt wurden Zeilenumbrüche mit erstellt habe... Wie bekomm ich diese nach dem Lesen wieder raus? Sonst sind meine Einträge alle untereinander, was aber so nicht sein sollte :/ Nur das gemischte soll untereinander... -
Zeilenumbrüche an sich werden mit \n oder \r gekennzeichnet. Leider ist da jedes System ein wenig eigen. Also
$myString = str_replace( array('\n' , '\r' ) , '' , $test );
Aber es geht auch einfacher, nutzen wir einfach die Flags der file() function:
$data[0] = file( $testfile1 , FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
Damit werden die Zeilenenden nicht mit einem Zeilenumbruchszeichen belegt, und leere Zeilen werden direkt übersprungen. Kommt denk ich mal dahin, wo du hin willst :)
Liebe Grüße -
ggamee schrieb:
Zeilenumbrüche an sich werden mit \n oder \r gekennzeichnet. Leider ist da jedes System ein wenig eigen. Also
$myString = str_replace( array('\n' , '\r' ) , '' , $test );
Aber es geht auch einfacher, nutzen wir einfach die Flags der file() function:
$data[0] = file( $testfile1 , FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
Damit werden die Zeilenenden nicht mit einem Zeilenumbruchszeichen belegt, und leere Zeilen werden direkt übersprungen. Kommt denk ich mal dahin, wo du hin willst :)
Liebe Grüße
Danke trotzdem für deine Mühe, hab aber einen einfacheren Weg :)
Für meine Nachfolger mal meine ganze Function:
public function call_all($table_name,$sp,$anzahl){ $dies = fopen ($this->createentry, "w"); fclose($dies); $spalten = implode(',',$sp); $data = array(); $data[0] = file($testfile1); $data[1] = file($testfile2); $data[2] = file($testfile3); $data[0] = preg_replace ("/\\015\\012|\\015|\\012/", " ", $data[0]); //Zeilenumbruch durch Leerzeichen ersetzen $data[1] = preg_replace ("/\\015\\012|\\015|\\012/", " ", $data[1]); //Zeilenumbruch durch Leerzeichen ersetzen $data[2] = preg_replace ("/\\015\\012|\\015|\\012/", " ", $data[2]); //Zeilenumbruch durch Leerzeichen ersetzen if(!empty($data)){ for($k=0;$k<$anzahl;$k++){ for($loop = 0;$loop < count($data)-1;$loop++){ $test = $data[$loop][$k]; $mystring = ''; $mystring .= $test; //echo $mystring; $textdatei = fopen ($this->createentry, "a+"); fwrite($textdatei, $mystring); fclose($textdatei); } $textdatei = fopen ($this->createentry, "a+"); fwrite($textdatei, "\r\n"); fclose($textdatei); } } }
###Kann geschlossen werden### -
Nur nochmal so reingeschmissen: Wenn es dir um Performance geht, dann solltest du die Flags der file() Funktion nutzen. Die "preg_" Funktionen wie preg_match oder auch preg_replace sind relativ langsam im Vergleich zu anderen Funktionen. str_replace zum Beispiel ist ebenfalls schneller. Wenn du also auch auf Performance achtest, und das Ergebnis das gleiche ist, würd ich dir empfehlen die file() Funktion zu benutzen.
Ist nur so ein Hinweis, denn Performance ist oftmals ja auch ein Thema, und besonders wenn man viele Aufrufe hat, dann kann man es merken, ob eine Funktion 2ms braucht, oder 20ms. (das sind nur Beispielzeiten)
Liebe Grüße -
ggamee schrieb:
Nur nochmal so reingeschmissen: Wenn es dir um Performance geht, dann solltest du die Flags der file() Funktion nutzen. Die "preg_" Funktionen wie preg_match oder auch preg_replace sind relativ langsam im Vergleich zu anderen Funktionen. str_replace zum Beispiel ist ebenfalls schneller. Wenn du also auch auf Performance achtest, und das Ergebnis das gleiche ist, würd ich dir empfehlen die file() Funktion zu benutzen.
Ist nur so ein Hinweis, denn Performance ist oftmals ja auch ein Thema, und besonders wenn man viele Aufrufe hat, dann kann man es merken, ob eine Funktion 2ms braucht, oder 20ms. (das sind nur Beispielzeiten)
Liebe Grüße
Hatte ich als erstes auch dran gedacht, aber leider gibt mir str_replace noch ein array zurück, dass ich dann wieder extra verarbeiten müsste. Aber so oder so ist es alles recht schnell gehalten :) Mache jetzt den Feinschliff und werde das heut Abend oder Mittag mal im Bereich Promotion vorstellen.. -
Also .... ich glaube das
ist falsch,array ('\r', '\n')
es muss in "doppelte" Anführungszeichen, so;array ("\r", "\n")
Vielleicht einfach im str_replace den zweiten Parameter auch als Array
so dass für jedes Elemet aus dem ersten Parameter ausch ein Ersetzung definiert ist
$test = str_replace( array("\n", "\r") , array('', '') , $test );
oder halt einfach in 2 Zeilen
$test = str_replace( "\r", '' , $test ); $test = str_replace( "\n", '' , $test );
oder doch gleich beim Einlesen der Text-Dateien mit den Flags für file()
$data[0] = file($testfile1, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); $data[1] = file($testfile2, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); $data[2] = file($testfile3, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
Wie sehen denn die Textdateien aus und wie willst du diese kombinieren ? ... ein Beispiel ?
Beitrag zuletzt geändert: 9.11.2012 10:37:08 von wmag -
wmag schrieb:
Also .... ich glaube das
ist falsch,array ('\r', '\n')
es muss in "doppelte" Anführungszeichen, so;array ("\r", "\n")
Stimmt, danke, das kann so garnicht funktionieren in single Quotes, da wirds garnicht ausgewertet. Das zweite Array ist aber, soweit ich weiß, nicht nötig. Es wird dann alles gegen das eine '' ersetzt.
Liebe Grüße -
ich wess jetzt nicht, wie die einzelnen Zeilen der 3 Quell-Dateien kombiniert werden sollen,
aber hier mal ein Beispiel, wie manes machen könnte:
<?php // ------------------------------------------------------- // ------------ PHP --- Text-Builder --- V.0.1 ----------- // ------------------------------------------------------- // ------------------------------------------- // ---------- Text Dateien (Quelle) ---------- $txt_file1 = 'daten_pfad/text_datei1.txt'; $txt_file2 = 'daten_pfad/text_datei2.txt'; $txt_file3 = 'daten_pfad/text_datei3.txt'; // ------------------------------------------- // ----------- Dateien zu Arrays ------------- $txt_data1 = file($txt_file1, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); $txt_data2 = file($txt_file2, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); $txt_data3 = file($txt_file3, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); // --------------------------------------------------- // --------- Ziel-Datei zum schreiben (open) --------- $save_file = 'daten_pfad/alle_texte.txt'; $handle = fopen($save_file, 'w', 0666); // ----------------------------------------------------------- // --------- String Zusammenbau und Zeilen schreiben --------- foreach($txt_data1 as $item1) { foreach($txt_data2 as $item2) { foreach($txt_data3 as $item3) { // ------ String aus Telen kombinieren ---------- // ------ mit Leerzeichen zwischen den Teilen --- $mystring = ''.$item1.' '.$item2.' '.$item3.''; // ------ String in Ziel-Datei schreiben -------- // ------ mit Zeilenumbruch am Ende der Zeile --- fwrite($handle, $mystring."\n"); } } } // -------------------------------------------------- // --------- Ziel-Datei schliessen (close) --------- fclose($handle); // -------------------------------------------------- // -------------- DEBUG Ausgabe (Test) -------------- $ergebnis = file($save_file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); print "<br />\n"; print "<br />\n"; print "<pre style=\"margin:4px; padding:6px; text-align:left; background:#DEDEDE;\">\n"; print_r($ergebnis); print "</pre>\n"; print "<br />\n"; print "<br />\n"; // ------------------------------------------------------- ?>
Anstelle der Leerzeichen (als Trenner) zwischen den Teilen (items)
kann man ja auch ein Komma (oder was auch immer) machen:
Anstatt innerhalb der foreach-Schleifen in die Ziel-Datei zu schreiben,
könnte man auch alle Zeilen in eine String-Variable zusammenbauen
und dann am Ende (nach den foreach-Schleifen) diese Daten schreiben
der Code-Teil dazu wäre dann so:
// --------------------------------------------------- // --------- Ziel-Datei zum schreiben (open) --------- $save_file = 'daten_pfad/alle_texte.txt'; $handle = fopen($save_file, 'w', 0666); $mystring = ''; // ----------------------------------------------------------- // --------- String Zusammenbau und Zeilen schreiben --------- foreach($txt_data1 as $item1) { foreach($txt_data2 as $item2) { foreach($txt_data3 as $item3) { // ------ String aus Telen kombinieren ---------- // ------ mit Leerzeichen zwischen den Teilen --- // ------ mit Zeilenumbruch am Ende der Zeile --- $mystring .= ''.$item1.' '.$item2.' '.$item3.' . "\n"'; } } } // -------------------------------------------------- // ------ String in Ziel-Datei schreiben -------- fwrite($handle, $mystring); // -------------------------------------------------- // --------- Ziel-Datei schliessen (close) --------- fclose($handle);
... je nachdem wie groß die Quell-Dateien sind, kann dabei der $mystring sehr groß werden,
wenn man alle Zeilen in diese eine Variable zusammen baut,
.... andererseits, wen man die Zeilen schon innerhalb der foreach-Schleifen schreibt,
und die Quell-Dateien viele Zeilen haben, dann muss der fwrite() Befehl sehr oft aufgerufen werden.
kann jetzt auch nicht sagen, was besser ist, ob Zeile je gleich schreiben oder am Ende alles schreiben
das ist ja auch von den Quell-Daten abhängig
... und den Zusammenbau (in den 3 verschactelten foreach-Schleifen) aus den Teilen (items)
kann man sicher auch anders machen, ich habe halt mal ne "einfache" Variante genommen,
also Teile aus Textdatei1 immer an erster Stelle, Teile aus Textdatei2 an 2ter Stelle, usw.
Wenn man das auch anders herum kombinieren will, kann man das ja entsprechend einfügen
$mystring .= ''.$item2.' '.$item1.' '.$item3.' . "\n"'; $mystring .= ''.$item3.' '.$item2.' '.$item1.' . "\n"'; $mystring .= ''.$item2.' '.$item1.' '.$item3.' . "\n"'; $mystring .= ''.$item2.' '.$item3.' '.$item1.' . "\n"'; // usw...
je nachdem wie die Quell-Daten aufgebaut sind und was man damit machen will
... was will der TE eigentlich machen ??? .... Keyword-Liste ? ... Content aus Text-Bausteine ?
Beitrag zuletzt geändert: 9.11.2012 14:19:25 von wmag -
Es gibt die Möglichkeit implode( String als Verbinder, Array) mit der man auch einen Array in einen String umwandeln kann.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage