kostenloser Webspace werbefrei: lima-city


php mehrdimensionales Array in String konvertieren

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    kill-a-teddy

    Kostenloser Webspace von kill-a-teddy

    kill-a-teddy hat kostenlosen Webspace.

    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 ^^
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. g****e

    Was hast du denn mit dem String vor?
    An sich kannst du vorher sowas machen wie
    $myString = '';
    und dann hast du innerhalb der for-Schleifen einfach
    $myString .= $test;


    Liebe Grüße
  4. Autor dieses Themas

    kill-a-teddy

    Kostenloser Webspace von kill-a-teddy

    kill-a-teddy hat kostenlosen Webspace.

    ggamee schrieb:
    Was hast du denn mit dem String vor?
    An sich kannst du vorher sowas machen wie
    $myString = '';
    und dann hast du innerhalb der for-Schleifen einfach
    $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...
  5. g****e

    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
  6. Autor dieses Themas

    kill-a-teddy

    Kostenloser Webspace von kill-a-teddy

    kill-a-teddy hat kostenlosen Webspace.

    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###
  7. g****e

    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
  8. Autor dieses Themas

    kill-a-teddy

    Kostenloser Webspace von kill-a-teddy

    kill-a-teddy hat kostenlosen Webspace.

    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..
  9. Also .... ich glaube das
    array ('\r', '\n')
    ist falsch,
    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
  10. g****e

    wmag schrieb:
    Also .... ich glaube das
    array ('\r', '\n')
    ist falsch,
    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
  11. 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
  12. Es gibt die Möglichkeit implode( String als Verbinder, Array) mit der man auch einen Array in einen String umwandeln kann.
  13. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!