jo: Klasse soll ein 2 dim. Array als Rückgabewert haben

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

  1. Hi,

    vielleicht tust Du Dir hiermit leichter: http://de2.php.net/manual/de/function.fgetcsv.php

    Gruesse, Joachim

    --
    Am Ende wird alles gut.
    1. Oder probier es doch mal mit einer
      foreach Schleife
      ist aber nicht ganz leicht hab ich bisher auch nur einmal gemacht.

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

        --
        Am Ende wird alles gut.
    2. 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

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

        --
        Am Ende wird alles gut.
        1. 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

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau

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

            --
            Am Ende wird alles gut.
            1. 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

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau

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

                --
                Am Ende wird alles gut.
  2. 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

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau

    1. hallo,

      $CSV_table = $class_CSVrw->CSVread("text.csv");
      print $CSV_table[0][0];

      ach so , super fein

      danke

      gruß

      jo

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

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau

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

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

    --
    My sssignature, my preciousssss!
    1. 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

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

        --
        My sssignature, my preciousssss!
        1. hallo,

          Das da läßt sich noch extrem verbessern. Warum die for-Schleife? Warum nicht einfach:

          man lernt nie aus :-)

          merci

          jo

    2. 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";