CSV als Object-Daten ?
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
ablegen
array
ausgabe
beispiel
brot
code
dank
datum
element
ergebnis
haupt
info
letzte zeile
letzten zeile
objekt
rundes gesicht
spalten
status
url
zeile
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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. -
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!
-
Ansonsten gäbe es da was ganz einfaches:
$row = deine row als Array $xdata[$i] = (object) $row;
spielzeug schrieb:
Das hast du dir doch bereits selbst erklärt:
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 ?!?spielzeug schrieb:
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.
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 -
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:
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]
... dann geht es auch damit
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
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage