Klasse soll ein 2 dim. Array als Rückgabewert haben
jo
- php
hallo,
Ich habe eine Klasse programmiert die CSV dateien auslesen soll und in ein 2 dimensionales Array speichert.
Mein problem ist wenn ich den rückgabewert printe bekomme ich als wert einfach den objekt typ, also "Array"
Was mache ich denn falsch, ich müßte doch bei dem aufruf (print $CSV_table[0][0]=$class_CSVrw->CSVread("text.csv");) die erste kolonne und erste zeile erhalten
Hier ist ein Beispiel:
[1] aufruf der klasse CSVrw
[2] die klasse CSVrw
[3] das ergebniss im browser
[4] und so sieht mein CSV datei aus
[1]
<?
include("../../include/class.inc.php");
$class_CSVrw=new CSVrw;
print $CSV_table[0][0]=$class_CSVrw->CSVread("text.csv");
?>
[2]
<?
class CSVrw {
function CSVrw() {
}
function CSVread($file_r) {
$this->file_r=$file_r;
$this->table=array();
$this->row=0;
$this->handle=fopen($this->file_r,"r");
while(($this->data=fgetcsv ($this->handle, 1000, ",")) !== FALSE ) {
//anzahl felder pro reihe
$this->cols=count($this->data);
//reihe in einem 2 dimensionalen array speichern
for($this->i=0; $this->i<$this->cols; $this->i++) {
print$this->table[$this->row][$this->i]=$this->data[$this->i];
print "<br />";
}
print "<br />";
//nächste zeile
$this->row++;
}
//datei schliessen
fclose ($this->handle);
return $this->table;
}
function CSVwrite($file_w,$file_target) {
$this->file_w=$file_w;
$this->file_target=$file_target;
}
}
?>
[3]
id
date
name
bearb
lang
nr
5
2006-12-1
juan
Nico
de
1
8
2006-10-3
Gaby
Nico
fr
3
15
2006-02-9
Nico
Nico
en
6
Array
[4]
"id","date","name","bearb","lang","nr"
"5","2006-12-1","juan","Nico","de","1"
"8","2006-10-3","Gaby","Nico","fr","3"
"15","2006-02-9","Nico","Nico","en","6"
gruß
jo
Hi,
vielleicht tust Du Dir hiermit leichter: http://de2.php.net/manual/de/function.fgetcsv.php
Gruesse, Joachim
Oder probier es doch mal mit einer
foreach Schleife
ist aber nicht ganz leicht hab ich bisher auch nur einmal gemacht.
Hi,
Oder probier es doch mal mit einer foreach Schleife
was hat eine foreach-Schleife damit zu tun, ausser das sich damit Arrays durchloopen lassen?
ist aber nicht ganz leicht hab ich bisher auch nur einmal gemacht.
nein, es es ganz leicht, vor allem wenn man die Doku liest: http://de2.php.net/manual/de/control-structures.foreach.php
Gruesse, Joachim
Hi,
vielleicht tust Du Dir hiermit leichter: http://de2.php.net/manual/de/function.fgetcsv.php
Diese seite ist mir bekannt, dann macht meine klasse aber keinen sinn.
Ich will mit meiner klasse bezwecken das ich eine csv datei in ein 2 dimensionales array speichere, um sie dann mit einer anderen methode im browser anzeigen oder sie in einer MySQL datenbank speichere.
Sonst brauche ich auch keine klasse zu programmieren.
Bei funktionen kann ich doch auch eine Array zurückgeben.
muß ich mit zeigern wie "&" arbeiten.
gruß
jo
Hi,»» »» Hi,
vielleicht tust Du Dir hiermit leichter: http://de2.php.net/manual/de/function.fgetcsv.php
Diese seite ist mir bekannt, dann macht meine klasse aber keinen sinn.
Doch, hab grade gesehen dass Du sie bereits nutzt. Probier das mal, ist allerdings nur schnell hingekritzelt:
<?php
class CSVrw {
function CSVrw() {
}
function CSVread($file_r) {
$this->file_r=$file_r;
$this->table=array();
$this->handle=fopen($this->file_r,"r");
while(($this->data=fgetcsv ($this->handle, 1000, ",")) !== FALSE ) {
$this->table[] = array();
foreach ($this->data as $val) {
$this->table[count($this->table) -1][] = $val;
}
}
//datei schliessen
fclose ($this->handle);
return $this->table;
}
}
$data = new CSVrw;
echo "<pre>";
print_r($data->CSVread("text.csv"));
echo "</pre>";
?>
Gruesse, Joachim
Hello Joachim,
Doch, hab grade gesehen dass Du sie bereits nutzt. Probier das mal, ist allerdings nur schnell hingekritzelt:
echo "<pre>";
print_r($data->CSVread("text.csv"));
echo "</pre>";
?>
Das haben wir hier gestern schon alles durch... :-)
Jo möchte nun den nächsten Schritt versuchen, und die verinnerlichten prozeduralen Zusammenhänge in ein sauberes Klassenkonzept verpacken. Er sit also schon zwei Schritte weiter, als Du vermutest.
Das kann man wissen, wenn man hier mitliest.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hi,
Das kann man wissen, wenn man hier mitliest.
naja, muss zwischendurch auch arbeiten ;-)
Aber - dann verstehe ich die Wahl des Subjekts nicht:
"Klasse soll ein 2 dim. Array als Rückgabewert haben"
Gruesse, Joachim
Hello,
Aber - dann verstehe ich die Wahl des Subjekts nicht:
"Klasse soll ein 2 dim. Array als Rückgabewert haben"
Weißt Du, warum "Entwicklung" Entwicklung heißt, und nicht "Hinschreibung"?
Klar, weil am Anfang alles noch recht verwickelt ist, und man selber meistens noch gar nicht so genau weiß, was man eigentlich erreichen kann und will.
Und Jo macht hier in doppelter Hinsicht eine Entwicklung. Er entwickelt sich selsbt und seine Kenntnisse in PHP und Programmiertechnik, und er entwickelt einen Werkzeugkasten, damit er seine DV-Probleme demnächst leichter lösen kann.
Ich mach Dir persönlich da keinerlei Vorwürfe, meine aber, dass Viele hier oft vergessen, dass Entwicklungen eben nur gemacht werden, weil noch alles verwickelt ist :-))
Man muss also versuchen, bei der Denkbereichserweiterung und Entwicklung zu helfen, und nicht den Denkbereich des Anderen durch rigide Vorgaben noch weiter einschränken und damit Knoten in die Denkleitung machen...
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hi,
Man muss also versuchen, bei der Denkbereichserweiterung und Entwicklung zu helfen, und nicht den Denkbereich des Anderen durch rigide Vorgaben noch weiter einschränken und damit Knoten in die Denkleitung machen...
Das mit den Leitungen hast Du jetzt irgendwie schön gesagt... aber bis das durch alle meine Gehirnwicklungen durch ist werde ich mich nicht in weitere Entwicklungen verwickeln.
Nur eins noch, ein Fehlerabwicklung à la 'if (!$handle = @fopen($path,"r")) $this->error = "..."' zwengs Klassenoptimierung habt Ihr ihm vermutlich bereits ums Herz gewickelt, oder?
;-)
Gruesse, Joachim
Hello,
Was mache ich denn falsch, ich müßte doch bei dem aufruf (print $CSV_table[0][0]=$class_CSVrw->CSVread("text.csv");) die erste kolonne und erste zeile erhalten
Sollte das vielleicht sowas werden?
$CSV_table = $class_CSVrw->CSVread("text.csv");
print $CSV_table[0][0];
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
hallo,
$CSV_table = $class_CSVrw->CSVread("text.csv");
print $CSV_table[0][0];
ach so , super fein
danke
gruß
jo
Hello,
$CSV_table = $class_CSVrw->CSVread("text.csv");
print $CSV_table[0][0];ach so , super fein
Ich würde aber für die Ausgabe einzelner Elemente oder einer Zeile eigene Methoden in der Klasse definieren.
Man sollte dann aber das Erstellen des Tables in der Klasse auch in einer statischen protected Vra vermerken, damit der nur neu erstellt wird, wenn Du z.B.
CSVrw->refresh;
anforderst.
Außerdem würde ich eine Init-Methode einführen, die den Tabellennamen übernimmt und dann das erste Auslesen besorgt. Diese Methoden sollten selber keine Daten zurückgeben, sondern nur festgelegte Fehlerwerte. 0 für kein Fehler, und dann selbstdefinierte Fehlerwerte für "File nicht vorhanden" und "Zugriff verweigert" usw.
Also
CSVrw->init("text.csv");
CSVrw->refresh;
CSVrw->getLine(20);
CSVrw->getElement(1,2);
CSVrw->getTable;
usw.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
hallo,
Ich würde aber für die Ausgabe einzelner Elemente oder einer Zeile eigene Methoden in der Klasse definieren.
habe vor in die richtung zu gehen
Man sollte dann aber das Erstellen des Tables in der Klasse auch in einer statischen protected Vra vermerken, damit der nur neu erstellt wird, wenn Du z.B.
schlüsselwörter wie protected, private usw. kann ich nicht benutzten.
erst ab PHP 5 >
oder ?
arbeite mit 4.3.11
gruß und danke
jo
Moin!
Was mache ich denn falsch, ich müßte doch bei dem aufruf (print $CSV_table[0][0]=$class_CSVrw->CSVread("text.csv");) die erste kolonne und erste zeile erhalten
Nein, auf keinen Fall.
> print $CSV_table[0][0]=$class_CSVrw->CSVread("text.csv");
Der Rückgabewert der Methode CSVread ist ein Array. Das weist du der Variablen §CSV_table[0][0] zu und willst es (das komplette Array) dann ausdrucken. Funktioniert nicht. Du kannst nicht mit den Indexangaben [0][0] auf das Arrayunterelement des Methodenergebnisses zugreifen, sondern produzierst hier ein Array mit multiplen Dimensionen, dein gewünschtes Ergebnis [0][0] im Funktionsergebnis steckt jetzt nämlich in $CSV_table[0][0][0][0].
$CSV_table=$class_CSVrw->CSVread("text.csv");
print $CSV_table[0][0];
So weist du das Ergebnisarray der Variablen $CSV_table zu (ohne irgendwelche Arraydimensionen) und druckst dann dessen Unterelement [0][0].
Deine Klasse ist allerdings auch zu kritisieren!
> <?
> class CSVrw {
>
> function CSVrw() {
> }
>
> function CSVread($file_r) {
> $this->file_r=$file_r;
// Warum dieses sinnlose Kopieren? $file_r steht dir innerhalb der gesamten Methode zur Verfügung. Muß der Dateinamen länger gespeichert werden?
> $this->table=array();
> $this->row=0;
> $this->handle=fopen($this->file_r,"r");
// Alle diese "$this->"-Variablen sind unnötig. Warum legst du global Eigenschaften dieser Klasseninstanz an? Das sollten alles lokale Variablen dieser Methode bleiben! Also weg mit $this->handle, ersetzen durch $handle.
//Auch in den folgenden Aufrufen entsprechend.
//Abgesehen davon sind diese Klasseneigenschaften auch nirgendwo definiert. Gibt das keine Fehlermeldung?
> while(($this->data=fgetcsv ($this->handle, 1000, ",")) !== FALSE ) {
> //anzahl felder pro reihe
> $this->cols=count($this->data);
> //reihe in einem 2 dimensionalen array speichern
> for($this->i=0; $this->i<$this->cols; $this->i++) {
> print$this->table[$this->row][$this->i]=$this->data[$this->i];
> print "<br />";
> }
> print "<br />";
> //nächste zeile
> $this->row++;
> }
> //datei schliessen
> fclose ($this->handle);
>
> return $this->table;
> }
>
> function CSVwrite($file_w,$file_target) {
> $this->file_w=$file_w;
> $this->file_target=$file_target;
> }
>
> }
> ?>
- Sven Rautenberg
hallo,
// Warum dieses sinnlose Kopieren? $file_r steht dir innerhalb der gesamten Methode zur Verfügung. Muß der Dateinamen länger gespeichert werden?
die klasse war noch nicht fertig.
habe mal alle unnötigen $this entfernt
//Abgesehen davon sind diese Klasseneigenschaften auch nirgendwo definiert. Gibt das keine Fehlermeldung?
meinst damit das man vor dem konstruktor alle $this variablen zuerst instanziert
ich hatte bis jetzt nie fehlermeldungen deswegen. werde es in zukunft aber immer machen.
z.b.:
var delimiter;
class CSVrw {
var $delimiter;
function CSVrw($delimiter) {
$this->delimiter=$delimiter;
}
function CSVread($file_r) {
$table=array();
$row=0;
//datei öffnen
$handle=fopen($file_r,"r");
while(($data=fgetcsv ($handle, 1000,$this->delimiter)) !== FALSE ) {
//anzahl felder pro reihe
$cols=count($data);
//reihe in einem 2 dimensionalen array speichern
for($i=0; $i<$cols; $i++) {
$table[$row][$i]=$data[$i];
}
//nächste zeile
$row++;
}
//datei schliessen
fclose ($handle);
return $table;
}
}
Wenn noch was nicht gut ist bitte sagen
gruß
jo
Moin!
> while(($data=fgetcsv ($handle, 1000,$this->delimiter)) !== FALSE ) {
> //anzahl felder pro reihe
> $cols=count($data);
> //reihe in einem 2 dimensionalen array speichern
> for($i=0; $i<$cols; $i++) {
> $table[$row][$i]=$data[$i];
> }
> //nächste zeile
> $row++;
> }
Das da läßt sich noch extrem verbessern. Warum die for-Schleife? Warum nicht einfach:
while(($data=fgetcsv ($handle, 1000,$this->delimiter)) !== FALSE ) {
//anzahl felder pro reihe
$cols=count($data);
$table[$row]=$data;
$row++;
}
$data ist ein Array, und du kopierst mit der for-Schleife jedes Feld dieses Arrays in neue Felder eines anderen Arrays. Das geht auch einfacher, indem einfach das ganze Array kopiert wird.
Und als zweite Stufe der Verbesserung:
while(($data=fgetcsv ($handle, 1000,$this->delimiter)) !== FALSE ) {
$table[]=$data;
}
$table wird am Anfang als leeres Array definiert, und mit nur [] am Ende wird automatisch $data als neues Element, automatisch aufwärts zählend im Index, angehängt.
Die Vorbelegungen jetzt nicht mehr genutzter Variablen können natürlich dann auch entfallen. :)
- Sven Rautenberg
hallo,
Das da läßt sich noch extrem verbessern. Warum die for-Schleife? Warum nicht einfach:
man lernt nie aus :-)
merci
jo
echo $begrüßung;
//Abgesehen davon sind diese Klasseneigenschaften auch nirgendwo definiert. Gibt das keine Fehlermeldung?
Nein. Wie bei PHP üblich werden nicht vorhandene Variablen beim ersten Schreibzugriff angelegt. Objekte bilden da keine Ausnahme. Wenn keine Klassenvariable definiert ist legt PHP eine Objektvariable (oder Instanzvariable) an.
echo "$verabschiedung $name";