kostenloser Webspace werbefrei: lima-city


CSV als Object-Daten ?

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    spielzeug

    spielzeug hat kostenlosen Webspace.

    Hallo
    ich habe eine CSV (hier Beispiel mit mit 10 Zeilen und 4 Spalten)

    beispiel.csv
    "ID";"Name";"Info";"Status"
    "01";"Hans";"rundes Gesicht";"a"
    "02";"Jenny";"dunkle Augen";"b"
    "03";"Peter";"lange Haare";"c"
    "04";"Horst";"kaut Fingernägel";"a"
    "05";"Doris";"hat Katzen gern";"a"
    "06";"Benny";"sein Hase hüpft";"c"
    "07";"Olav";"mag keine Muscheln";"b"
    "08";"Anja";"trinkt gerne Milch";"a"
    "09";"Otto";"macht viele Witze";"c"
    "10";"Bernd";"isst gerne Brot";"a"



    wenn ich eine CSV-Datei auslese, und die Spalten als Array ablege, dann klappt es
    ... als 2-dimensionales Array

    <?php 
    // ------------------------------------------------------------------------- 
    
    function csv_to_array($csvurl,$length=0,$delimiter=";",$enclosure="\"",$csvhead=true) {
    
    $csvdata = array(); 
    $ReadHandle = fopen($csvurl, 'r');
    
    if ($csvhead === true) { 
    	$headrow = fgetcsv($ReadHandle, $length, $delimiter, $enclosure); 
    } 
    
    while($line = fgetcsv($ReadHandle, $length, $delimiter, $enclosure)) { 
    	
    	if ($csvhead === true) { 
    		foreach ($headrow as $key=>$heading) {
    		$row[$heading] = $line[$key];   // ---- ARRAY ---- 
    		}
    		$csvdata[] = $row;
    	} 
    	else { 
    		$csvdata[] = $line;	
    	} 
    		
    }
    fclose($ReadHandle);
    
    return $csvdata; 
    
    }
    
    // ---------------------------------------------- 
    
    
    $resdata1 = csv_to_array('beispiel.csv'); 
    
    echo "<p>DEBUG Ausgabe 1 (array)</p>\n";
    
    print "<pre style=\"text-align:left; margin:10px; padding:6px; background:#EFEFEF;\">\n"; 
    print_r($resdata1);
    print "</pre>\n"; 
    
    // ------------------------------------------------------------------------- 
    ?>


    Spalten als Array-Daten ... funktioniert 1A

    DEBUG Ausgabe 1 (array)
    
    Array
    (
        [0] => Array
            (
                [ID] => 01
                [Name] => Hans
                [Info] => rundes Gesicht
                [Status] => a
            )
    
        [1] => Array
            (
                [ID] => 02
                [Name] => Jenny
                [Info] => dunkle Augen
                [Status] => b
            )
    ...usw...
    )



    aber wenn ich versuche die Spalten-Daten als Object abzulegen,
    dann kommt im Ergebnis für jedes Hauptelement immer die Daten der letzten Zeile ?!

    ... als Array of Objects

    <?php 
    // ------------------------------------------------------------------------- 
    
    function csv_to_object($csvurl,$length=0,$delimiter=";",$enclosure="\"",$csvhead=true) {
    
    $csvdata = array(); 
    $ReadHandle = fopen($csvurl, 'r');
    
    if ($csvhead === true) { 
    	$headrow = fgetcsv($ReadHandle, $length, $delimiter, $enclosure); 
    } 
    
    while($line = fgetcsv($ReadHandle, $length, $delimiter, $enclosure)) { 
    	
    	if ($csvhead === true) { 
    		foreach ($headrow as $key=>$heading) {
    		 $row->$heading = $line[$key];   // ---- OBJECT ---- 
    		}
    		$csvdata[] = $row;
    	} 
    	else { 
    		$csvdata[] = $line;	
    	} 
    		
    }
    fclose($ReadHandle);
    
    return $csvdata; 
    
    }
    
    // ---------------------------------------------- 
    
    
    $resdata2 = csv_to_object('beispiel.csv'); 
    
    echo "<p>DEBUG Ausgabe 2 (object)</p>\n";
    
    print "<pre style=\"text-align:left; margin:10px; padding:6px; background:#EFEFEF;\">\n"; 
    print_r($resdata2);
    print "</pre>\n"; 
    
    
    // ------------------------------------------------------------------------- 
    ?>



    Spalten als Object-Daten ... funktioniert nicht ... 10 mal die Daten der letzen Zeile

    DEBUG Ausgabe 2 (object)
    
    Array
    (
        [0] => stdClass Object
            (
                [ID] => 10
                [Name] => Bernd
                [Info] => isst gerne Brot
                [Status] => a
            )
    
        [1] => stdClass Object
            (
                [ID] => 10
                [Name] => Bernd
                [Info] => isst gerne Brot
                [Status] => a
            )
    
        [2] => stdClass Object
            (
                [ID] => 10
                [Name] => Bernd
                [Info] => isst gerne Brot
                [Status] => a
            )
    ...usw...
    )



    ................... was ist da falsch ??? ... immer nur Zeile 10 ?!?

    der einzige Unterschied ist ja

    $row[$heading] = $line[$key];   // ---- ARRAY ----

    und
    $row->$heading = $line[$key];   // ---- OBJECT ----


    es sind jedesmal 10 Elemente, bei Array klappt es wunderbar
    aber warum wird bei Daten als Object immer nur die letzte Zeile genommen ???

    --> Wie kann ich per fgetcsv() die Spalten-Daten als Objekt ablegen ?!

    PS: für XML gibt es ja simplexml_load_file()
    gibt es sowas auch für CSV, also simplecsv_load_file()
    ... bzw. ... sowas will ich hier ja grad selber machen als csv_to_object()
    das klappt aber so nicht ... HELP ... wie geht's, .. was ist da falsch ?
    Danke!




    Beitrag zuletzt geändert: 12.7.2012 18:45:46 von spielzeug
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

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

  3. Ich verstehe nicht was gegen das Array spricht?

    Aber wenn du dich so quälen willst, dann schau dir mal get_object_vars an.
    Du musst dir nur eine eigene Funktion dafür schreiben.
  4. Autor dieses Themas

    spielzeug

    spielzeug hat kostenlosen Webspace.

    Hallo,
    Danke, aber get_object_vars ist die falsche Richtung,
    es geht ja nicht darum, Werte aus Object auslesen, sondern Werte als Object zu speichern

    ich will ein Haupt-Array (erste Ebene) in dem dann die Objekte (zweite Ebene) sind

    habe noch bischen rum-probiert, und etwas dabei herausgefunden ....

    wenn ich das gewünschte Object vorher in $row ablege
    und erst dann zum Haupt-Array anfüge, dann geht es nicht, es kommt immer nur letzte Zeile an

    $xdata = array(); 
    $ReadHandle = fopen($source_file, 'r');
    $headrow = fgetcsv($ReadHandle, $length, $delimiter, $enclosure); 
    
    $i=0; 
    while($line = fgetcsv($ReadHandle, $length, $delimiter, $enclosure)) { 
    
    	foreach($headrow as $hkey=>$hval) { 
    		$row->$hval = $line[$hkey];
    	}
    	
    	$xdata[$i] = $row; 
    	$i++; 
    }
    
    fclose($ReadHandle);


    so hat $xdata zwar 10 Elemente aber alle enthalten nur Daten der letzten Zeile !!


    aber ... wenn ich das Object direkt in das Array einfüge (ohne vorher Ablage in $row) dann gehts ?!
    $ydata = array(); 
    $ReadHandle = fopen($source_file, 'r');
    $headrow = fgetcsv($ReadHandle, $length, $delimiter, $enclosure); 
    
    $i=0; 
    while($line = fgetcsv($ReadHandle, $length, $delimiter, $enclosure)) { 
    	
    	foreach($headrow as $hkey=>$hval) { 
    		$ydata[$i]->$hval = $line[$hkey];
    	}
    	
    	$i++; 
    }
    
    fclose($ReadHandle);


    so hat $ydata die 10 Elemente mit jeweils Daten passend zur Zeile !! ... also OK
    ... verstehe ich nicht :oO


    EDIT:
    und auch der erste Versucht (mit Ablegen in $row) geht dann,
    wenn ich $row vor dem foreach() als neues StdClass Object definiere

    also zwischen der while() Zeile und der foreach() Zeile
    noch die folgende Zeile einfügen:
    $row = new stdClass();

    ... dann geht es auch damit

    $xdata = array(); 
    $ReadHandle = fopen($source_file, 'r');
    $headrow = fgetcsv($ReadHandle, $length, $delimiter, $enclosure); 
    
    $i=0; 
    while($line = fgetcsv($ReadHandle, $length, $delimiter, $enclosure)) { 
    	$row = new stdClass();  
    	foreach($headrow as $hkey=>$hval) { 
    		$row->$hval = $line[$hkey];
    	}
    	
    	$xdata[$i] = $row; 
    	$i++; 
    }
    
    fclose($ReadHandle);



    warum geht es, wenn ich das Object direkt in das Haupt-Array ablege
    aber nicht, wenn ich das Objekt in einer Variable ($row) zwischenspeicher ???
    ist doch Quasi genau der gleiche Vorgang .... 1. Ebene = Array, 2. Ebene = Objekt

    hat das einen Sinn? einen Logik? .... kann mir das jemand erklären (zum Verständnis)
    warum es bei Ablegen direkt in Array geht, aber bei Ablegen in $row nicht geht ?!?
    Danke!

  5. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Ansonsten gäbe es da was ganz einfaches:
    $row = deine row als Array
    $xdata[$i] = (object) $row;


    spielzeug schrieb:
    warum geht es, wenn ich das Object direkt in das Haupt-Array ablege
    aber nicht, wenn ich das Objekt in einer Variable ($row) zwischenspeicher ???
    ist doch Quasi genau der gleiche Vorgang .... 1. Ebene = Array, 2. Ebene = Objekt

    hat das einen Sinn? einen Logik? .... kann mir das jemand erklären (zum Verständnis)
    warum es bei Ablegen direkt in Array geht, aber bei Ablegen in $row nicht geht ?!?
    Das hast du dir doch bereits selbst erklärt:
    spielzeug schrieb:
    EDIT:
    und auch der erste Versucht (mit Ablegen in $row) geht dann,
    wenn ich $row vor dem foreach() als neues StdClass Object definiere

    also zwischen der while() Zeile und der foreach() Zeile
    noch die folgende Zeile einfügen:
    $row = new stdClass();

    ... dann geht es auch damit
    Du kannst nicht einfach auf eine Variable des "Nichts" zugreifen! PHP muss zuerst mal wissen, dass das ein Objekt sein soll, sonst wirft es Fehelrmeldungen die du aber vermutlich deaktiviert hast.
  6. Autor dieses Themas

    spielzeug

    spielzeug hat kostenlosen Webspace.

    hackyourlife schrieb:
    Ansonsten gäbe es da was ganz einfaches:
    $row = deine row als Array
    $xdata[$i] = (object) $row;


    ja, Danke,
    das mit (object) hatte ich auch ausprobiert, allerdings an der falschen Stelle
    und dadurch dann jedes Object wieder in einem Object [scalar) bekommen

    $i=0; 
    while($line = fgetcsv($ReadHandle, $length, $delimiter, $enclosure)) { 
    	foreach($headrow as $hkey=>$hval) { 
    		$row[$hval] = (object)$line[$hkey];
    	}
    	$xdata[$i] = $row; 
    	$i++; 
    }


    Ergebnis war:
    Array
    (
        [0] => Array
            (
                [ID] => stdClass Object
                    (
                        [scalar] => 01
                    )
    
                [Name] => stdClass Object
                    (
                        [scalar] => Hans
                    )
    
                [Info] => stdClass Object
                    (
                        [scalar] => rundes Gesicht
                    )
    
                [Status] => stdClass Object
                    (
                        [scalar] => a
                    )
    
            )
    
        [1] => Array
            (
                [ID] => stdClass Object
                    (
                        [scalar] => 02
                    )
    
                [Name] => stdClass Object
                    (
                        [scalar] => Jenny
                    )
    
                [Info] => stdClass Object
                    (
                        [scalar] => dunkle Augen
                    )
    
                [Status] => stdClass Object
                    (
                        [scalar] => b
                    )
    
            )
    
        [2] => Array
            ... usw ...
    )


    weil ich dachte, es muss ja jedes einzele Elemet zu Object werden ...

    Wenn ich es so mache, so wie von Dir gezeigt,
    dass ich (object) erst bei Zusammenbau des Arrays anwende, dann klappt es :)

    $i=0; 
    while($line = fgetcsv($ReadHandle, $length, $delimiter, $enclosure)) { 
    	$row = array(); 
    	foreach($headrow as $hkey=>$hval) { 
    		$row[$hval] = $line[$hkey];
    	}
    	$xdata[$i] = (object)$row; 
    	$i++; 
    }


    also das wäre dann auch eine Möglichkeit :)

    hackyourlife schrieb:
    ... dann geht es auch damit
    Du kannst nicht einfach auf eine Variable des "Nichts" zugreifen! PHP muss zuerst mal wissen, dass das ein Objekt sein soll, sonst wirft es Fehelrmeldungen die du aber vermutlich deaktiviert hast.[/quote]

    ja komisch,
    wenn ich Daten als Array ablege, dann klappt es, Array wird erkannt, auch ohne $row = array();
    $row[$hval] = $line[$hkey]; wird zu Array in 2te Ebene durch $xdata[$i] = $row; ... ohne Probleme

    aber
    wenn ich aus dem Array ein Object machen will, ohne $row = array();

    $i=0; 
    while($line = fgetcsv($ReadHandle, $length, $delimiter, $enclosure)) { 
    	foreach($headrow as $hkey=>$hval) { 
    		$row[$hval] = $line[$hkey];
    	}
    	$zdata[$i] = (object)$row; 
    	$i++; 
    }


    dann kommt Fehlermeldung
    Fatal error: Cannot use object of type stdClass as array


    aber mit der Festlegung vorher das $row ein leeres Array ist,gehts dann
    $i=0; 
    while($line = fgetcsv($ReadHandle, $length, $delimiter, $enclosure)) { 
    	$row = array(); 
    	foreach($headrow as $hkey=>$hval) { 
    		$row[$hval] = $line[$hkey];
    	}
    	$zdata[$i] = (object)$row; 
    	$i++; 
    }


    mit der Zeile $row = array(); klappt es wunderbar ?? aber warum wird $row sonst auch als Array erkannt wenn ich es als 2D-Array ablege, aber für Ablegen als (object) muss ich Datentyp vorher definieren ?


    naja, ich dachte PHP erkennt den Datentyp (String oder Array) von selbst
    die Variable $xdata[$] wird ja als Array erkannt, auch ohne vorher zu machen $xdata = array();
    einfach durch $xdata[$i] = 'blabla';

    daher bin ich davon ausgegangen, wenn ich $row->$hval = 'blabla'; mache
    dass dann $row auch automatisch als Object erkannt wird ... falsch gedacht :(

    aber ohne $row = new stdClass(); bekam ich auch keine Fehlermeldung,
    es wurde einfach immer nur Daten aus der letzten Zeile ($line) verwendet,
    also als Object hat so ja geklappt,
    aber der Inhalt war je Hauptarray-Element immer der gleiche (letzte Zeile) ?!

    und DAS verstehe ich immernoch nicht, warum im Ergebnis-Array
    jedes Element überschrieben wurde von der letzten Zeile ....
    denn die letzte Zeile kommt in der while-Schleife ja nur einmal dran
    und bei Debug-Ausgabe innerhalb der foreach() mit print "<br />".$line[$hkey]."\n";
    kamen auch die "richtigen" Werte (je Zeile)

    Wie kann der letzte Durchlauf von while() alle vorherigen Elemente überschreiben ?
    die waren doch schon, und Ablegen der letzten (10.) Zeile ist ja in $xdata[9]
    die Elemente 0 bis 8 werden da doch garnicht mehr "angefasst" .... daher ?oOo?

    bischen verwirrend
    ... manchmal erkennt PHP selbst ob ein Array vorliegt,
    aber manchmal nicht ... z.B. bei (object) davor siehe Fehlermeldung

  7. 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!