Supportnet Computer
Planet of Tech

Supportnet / Forum / Skripte(PHP,ASP,Perl...)

Array entsprechend dem Wert, der Übergebenen Variablen anlegen





Frage

Hallo Leute Ich möchte gernen ein Array anlegen, welches den Wert der Variablen besitzt, die ich der Funktion übergebe, welche die Funktion aufruft, wo das Array erstellt wird. Klingt etwas Kompliziert darum erklär ichs am Code. [code] function laden(dateiname) { var http = null; if (window.XMLHttpRequest) { http = new XMLHttpRequest(); } else if (window.ActiveXObject) { http = new ActiveXObject("Microsoft.XMLHTTP"); } if (http != null) { http.open("GET", dateiname, true); http.onreadystatechange = array; http.send(null); } }[/code] Diese Funktion lädt mir die Datei mit dem Übergebenen Dateinamen (z.B. Mitarbeiter.csv) und ruft die Funktion array auf. [code] function array() { if (http.readyState == 4) { var buffer = http.responseText; var columnarray = buffer.split("\n"); test = new Array(); for (x = 0; x < columnarray.length; x++) { test[x]= new Array(); rowarray = columnarray[x].split(";"); for (y = 0; y < rowarray.length; y++) { test[x][y]=rowarray[y]; } } } } [/code] Diese Funktion erzeugt mir jetzt ein Array mit dem Inhalt der Datei. Der Name des Array ist jetzt test. Der Name soll aber Mitarbeiter sein. Da ich mehre Datein so in ein Array packen möchte, wäre es gut wenn es dafür irgend eine Möglichkeit gibt. Hoff ich hab mich verständlich ausgedrückt und ihr könnt mir Helfen Tschau Dieter PS: Bei Fragen meldet euch noch mal

Antwort 1 von rfb

Zitat:
Der Name des Array ist jetzt test. Der Name soll aber Mitarbeiter sein.
einfach umbenennen hilft nicht?

Also vermute ich mal, dass mit
Zitat:
Da ich mehre Datein so in ein Array packen möchte
gemeint ist: Die Funktion soll auf mehrere Dateiinhalte angewandt werden und diese sollen jeweils in ein Array mit eigenem Namen gesteckt werden.

Da bleibt dir wohl nur als Notbehelf die Möglichkeit einer globalen Variablen (denn du nutzt offenbar keine in Objekte gekapselten Funktionen)
dateiname
(".csv" absägen!) und sprichst die in
laden()
an. In
array()
kannst du mittels dieser globalen Variablen eine neue Variable
window[dateiname]
anstelle von
test
erschaffen. Diese steht dir - wenn der
dateiname
"Mitarbeiter" ist - als Variable
Mitarbeiter
global zur Verfügung.

Antwort 2 von Dieter1

Hallo

Zitat:
(denn du nutzt offenbar keine in Objekte gekapselten Funktionen)

Bin neu auf dem Gebiet und weiß nicht genau was damit gemeint ist und kann dir erstmal dies bezüglich nicht weiter helfen.


Habe folgen beitrag hier gefunden

https://supportnet.de/threads/1550917

Mit dessen Hilfe lass ich mir ebenfalls das Menü zum Aufrufen der funktion
laden()
erstellen. Habe Auch in der gleichen Form ein Array mit den Dateinamen angelegt.

Beim Aufruf der Funktion
laden()
übergebe ich ja den Dateinamen.

Wie meinst du das mit der globalen Variablen? Wo und wie soll ich die anlegen und woher weiß ich welche Datei in der Funktion
laden()
geöffnet werden soll?

Irgenwie steh ich auf den Schlauch. Könntest du mir dies etwas näher erklären oder Codefragmente posten.


Danke für die Hilfe

Dieter

Antwort 3 von rfb

globale Variable: steht überall zur Verfügung, wird außerhalb einer Funktion deklariert (oder innerhalb einer Funktion durch Weglassen von var - ist aber nicht zu empfehlen)

lokale Variable: wird lokal in einer Funktion deklariert (mit var), steht nur dort zur Verfügung, wird beim Verlassen der funktion gelöscht.

Infos: SelfHTML (unbedingt durcharbeiten)

Also setze irgendwo außerhalb des ganzen Funktionskrams

var dateiname="Mitarbeiter.csv"


Dann kannst du das dateiname beim Funktionsaufruf von laden weglassen.

Ich kann jetzt dazu nicht mehr schreiben ohne deine Scriptstruktur näher zu kennen.

Antwort 4 von Dieter1

Hallo

Was der Unterschied zwischen globaler und lokaler Variablen ist weiß ich. Meine Frage war etwas blöd gestellt. Wollt wissen wie ich die globale Variable anlegen muss und in der Funktion laden dann weiß welche Datei geöffnet wird.

Poste dir mal meinen gesamten Code

HTML-Dokument

<html>
   <head>
      <title>AJAX</title>
      <script type="text/javascript" src="laden.js"></script>
      <script type="text/javascript" src="array.js"></script>
      <script type="text/javascript" src="build_menu.js"></script>
      <script type="text/javascript" src="verarbeiten.js"></script>
   </head>
   <body>
      <!--Anzeige des Menüs-->
      <div id="menu"></div><br />

      <script type="text/javascript">
      <!--
        //Array für die Datein
        dateien = new Array( "Mitarbeiter.csv",
	  	            "Artikel.csv",
		       	    "Bestellung.csv",
		      	  );
	//erzeugen des Menüs
	build_menu();
      --></script>

      <!--Anzeige des Datein (Inhalt)-->
      <div id="Ausgabe"></div><br />
   </body>
</html>

In das Array soll der Anwender je nach bedarf weiter Dateinamen angeben können.

Funktion zum erstellen des Menüs:

function build_menu(){
   var htm="<table><tr><td>löschen</a></td>";
   for(var n=0;n<dateien.length;n++){
      htm+="<td><a href=\"javascript:laden('"+dateien[n]+"');\">"+dateien[n]+"</a></td>";
   }
   htm+="<td><a href=\"javascript:verarbeiten();\">Verarbeitung</a></td>";
   htm+="</tr></table>";
   document.getElementById("menu").innerHTML=htm;
}


Funktion zum laden der Datei

var http = null;
function laden(dateiname)
{
   if (window.XMLHttpRequest) { 
      http = new XMLHttpRequest();
   }
   else if (window.ActiveXObject) {
      http = new ActiveXObject("Microsoft.XMLHTTP");
   }
   if (http != null) {
      http.open("GET", dateiname, true);
      http.onreadystatechange = array;
      http.send(null);
   }
}



Funktion zum erzeugen des Arrays(bei funktion laden() aufgerufen)

var test = new Array();
function array() {
   if (http.readyState == 4) {
      var buffer = http.responseText;
      var columnarray = buffer.split("\n");
      for (x = 0; x < columnarray.length; x++) {
      test[x]= new Array();
        for (y = 0; y < rowarray.length; y++) {
          test[x][y]=rowarray[y];
        }
      }
      document.write(test[1][1]);
   }
}


In der Funktion
array()
möchte ich jetzt nach Betätigung des Verweise ein Array mit dem Namen der Datei (ohne .csv), welche geladen wurde, erstellen.

Muss ich jetzt für jede Datei eine globale Variable in der Form
var dateiname="Mitarbeiter.csv"
anlegen? Ich habe ja das Array wo die Dateinamen drinne stehen.

Wen beim Funktionsaufruf die Variable weglasse, woher weis ich dann welche Datei geladen werden soll. Für jeden Verweis soll eine andere Datei geladen werden.

Hoffe du kannst mir jetzt noch mal helfen, wäre echt dankbar dafür

Tschau Dieter

Antwort 5 von renan

Zitat:
In das Array soll der Anwender je nach bedarf weiter Dateinamen angeben können.

zur laufzeit? das ist nicht schwer. jedes element eines arrays kann man auch über seinen index ansprechen. und wenn man einem element einen wert zuweist, dessen indexwert noch gar nicht existiert, dann wird dieses von js neu erzeugt.
also es existieren die elemente
dateien[0]="Mitarbeiter.csv"
dateien[1]="Artikel.csv"
und dateien[2]="Bestellung.csv"
mit
dateien[3]="neue_datei.csv"
hängt man einen neuen eintrag an den array hinten dran. demo:


<html><head></head><body>
<script type="text/javascript">
var dateien=new Array(
	"Mitarbeiter.csv",
	"Artikel.csv",
	"Bestellung.csv"
);
display_array(dateien);
erweitere_array(dateien);
display_array(dateien);

function erweitere_array(a){
	a[a.length]=prompt("neuen Dateinamen eingeben:");
	return(a);
}

function display_array(a){
	var msg="";
	for(var n=0;n<a.length;n++) msg+=a[n]+"\n";
	alert(msg);
}
</script>
</body></html>


Antwort 6 von renan

berichtigung:

...
display_array(dateien);
dateien=erweitere_array(dateien);
display_array(dateien);
...

das skript funktionierte aber trotzdem, was mich allerdings ein bisschen erschreckt!
vielleicht kann mir das jemand erklären?

Antwort 7 von Dieter1

Hallo renam

Das Array mit den Dateinamen soll nicht zur Laufzeit erzeugt werden. Der Nutzer vervollständigt es im Code. Pssiert nur recht selten, daher dürfte es keine Probleme geben.

Ich wollte eigentlich wissen wie ich ein Array, dessen Name dem Wert von dateiname. Die Variable Dateiname wird der Funktion laden() übergeben, welche dann die Funktion array() aufruft. Das Array soll in der Funktion array() erzeugt werden. Ich möchte für jede Datei, die ich lade ein extra Array haben, mit dem Namen der Datei ohne der Endung csv. DIeses Array wird zur Laufzeit erzeugt.

rfb hat ja in Antwort1 schon mal einen Lösungsvorschlag gepostet. Ich weiß aber nicht wie ich dies richtig umsetzten soll.

Vielleicht kannst du mir dies näher erklären wie ich das machen muss.

Tschau Dieter

Antwort 8 von renan

bin mir nicht sicher ob ich verstanden habe. du möchtest zur laufzeit einen array mit variablem namen erzeugen? mein erster gedanke dazu wäre, ein array zu haben und per assoziation mehrere arrays dort reinzustecken.
var a=new Array();
var b=new Array();
var c=new Array();
var name="peter";
a[name]=b;
name="wolf";
a[name]=c;
also statt einem array names "peter" hat man diesen array in a["peter"]

Antwort 9 von Dieter1

Hallo

eine gesamten Code hab ich ja bereits gepostet.

Ich möchte in der Funktion
array()
ein Array erzeugen, welches den Namen besitzt, den die Variable Dateiname als Wert bei der Funktion
laden()
besitzt.

Die Dateinamen stehen bereits in einem Array "dateien". Wenn ich die Funktion
laden()
mittels Verweis aufrufe (siehe Funktion
build_menu()
) übergebe ich ja den Dateinamen.

Da ich die Dateien in der Funktion
verarbeiten
auswerten möchte, benötige ich ja jeden Dateiinhalt in einem Array. Ich möchte aber auch nicht für jeden Verweis eine andere Funktion
laden()
aufrufen, die dann eine Funktion array1, array2 und soweiter aufruft. Und in den Funktionen array() ändere ich dan nur den Namen des zu erstellenden Arrays.

Sieh dir bitte noch mal meine Funktion Array() an. Dort erstelle ich ein Array Namens Test. Wenn ich aber die Datei Mitarbeiter lade soll es aber Mitarbeiter heißen. Also jenachdem welchen Link ich betätige und die dem entprechende Datei lade so soll das array heißen.

Irgendwie ganzschön verwirrend, hoff ihr versteht mich aber trotztdem und könnt mir weiterhelfen

Tschau Dieter

Antwort 10 von renan

Zitat:
Sieh dir bitte noch mal meine Funktion Array() an. Dort erstelle ich ein Array Namens Test. Wenn ich aber die Datei Mitarbeiter lade soll es aber Mitarbeiter heißen. Also jenachdem welchen Link ich betätige und die dem entprechende Datei lade so soll das array heißen.

sorry aber ich versteh deinen code nicht. aber deine anforderung wird durch meinen vorschlag (fast) erfüllt, nur dass es keine eigene arrayvariable mit diesem namen ist, sondern quasi ein "unterarray" eines array mit dem gewünschten namen:

<a href="javascript:erzeuge('mitarbeiter.txt')">mitarbeiter</a>
<a href="javascript:erzeuge('sabotteur.txt')">sabotteur</a>

var container=new Array(); // global

function erzeuge(arrayname){
	container[arrayname]=lade_in_array(arrayname);
}

function lade_in_array(dateiname){
	var txt=new Array();
	// lese datei in array txt
	return(txt);
}

wenn der anwender auf den link mitarbeiter klickt, wird im globalen array, namens container, ein element mit namen container["mitarbeiter.txt"] und dem inhalt der datei mitarbeiter.txt erzeugt.

ps: der code ist so nicht lauffähig, soll nur die idee vermitteln.
pps: ich glaube, dass man in js nicht mit variablen variablennamen arbeiten kann. das geht in php, aber da ist auch jede variable durch ein spezielles symbol gekennzeichnet. ich versteh auch nicht, warum du diese anforderung hast. normalerweise braucht man sowas nicht. aber egal, was das weiterverwenden der daten unter dem aufruf dieses variablen namens angeht, sollte mein vorschlag das gleiche leisten.

Antwort 11 von Dieter1

Hallo
@renam
Zitat:
pps: ich glaube, dass man in js nicht mit variablen variablennamen arbeiten


lauf der Antwort von rfb muss es aber möglich sein, wenn ich fie Antwort richtig verstanden habe
Zitat:
Da bleibt dir wohl nur als Notbehelf die Möglichkeit einer globalen Variablen (denn du nutzt offenbar keine in Objekte gekapselten Funktionen) dateiname (".csv" absägen!) und sprichst die in laden() an. In array() kannst du mittels dieser globalen Variablen eine neue Variable window[dateiname] anstelle von test erschaffen. Diese steht dir - wenn der dateiname "Mitarbeiter" ist - als Variable Mitarbeiter global zur Verfügung.



Zitat:
ich versteh auch nicht, warum du diese anforderung hast.

Ich habe bis jetzt drei Datein: Mitarbeiter, Artikel und Bestellung. In Bestellung stehn nur Zahlen (ID's) drinne. Ich möchte aber wissen welcher Mitarber, welchen Artikel bestellt hat.
In Bestellung steht also 1; 3; 5. Das Bedeutet das Meier 5 X Druckerpapier bestellt hat. Und um diese Auswertung vorzunehmen muss ich auf den Dateiinhalt zu greifen. Den Inhalt hät ich gerne in ein Array gespeichert.

Zitat:
normalerweise braucht man sowas nicht.

Wie würdest du es denn sonst realieseren

Ich werde mich mal mit den assoziativen Arrays befassen, mal sehn ob ich hinbekomme.

@rfb
Wäre nett wenn du mir nochmals helfen könntest bzgl. der Verwendung von window[dateiname]. Habe "test" in der funktion array einfach durch window[dateiname] ersetzt. Und eine globale Variable angelegt in der der Dateiname gespeichert wird. Funktioniert nicht so richtigt (soll heißen das garnichts mehr gemacht wird und auch keine Fehlermeldung erscheint). Wie muss ich window[dateiname] richtig verwenden.

Danke für eure Hilfe

Dieter

Antwort 12 von renan

Zitat:
lauf der Antwort von rfb muss es aber möglich sein, wenn ich fie Antwort richtig verstanden habe

stimmt, hört sich so an.

Zitat:
In Bestellung steht also 1; 3; 5. Das Bedeutet das Meier 5 X Druckerpapier bestellt hat.[..] Wie würdest du es denn sonst realieseren

ich würd das so machen, dass ich assoziative arrays erzeugen würde. aber nicht unbedingt für jede datei einen array, sondern einen für mitarbeiter, einen für material etc.
bsp:
mitarbeiter["3"]="Meier";
material["5"]="Druckerpapier";
aber nicht mit variablen variablennamen. die möglichen variablennamen stehen doch vor beginn der programmausführung schon fest. klar, kann man versuchen, eine verallgemeinerte version zu programmieren, die auch bei willkürlich hinzugefügten neuen dateienamen immer noch ihren dienst versieht. das ist aber extrem kompliziert und letztlich auch ziemlich illusorisch. zum einen ist das format (anzahl der spalten) dieser neuen datei unbekannt und zum anderen kommt mit einer neuen datei normalerweise auch ein neuer sinnzusammenhang zwischen den objekten dazu, der sowieso eine änderung des restlichen quelltextes nötig macht.
wenn man mit anderen dateien arbeiten möchte, muss man also erstmal dafür sorgen, dass die datei dem programm mitteilt, welche objekte sich in ihr in welcher spalte befinden. dein programm muss eine anzahl objekte kennen (bzw alle die es zukünftig geben kann) und deren beziehung untereinander. dann kann das funzen.

Antwort 13 von renan

aber wenn ichs mir nochmal überlege .. wenn das programm alle objekttypen kennt, brauch es eigentlich auch wieder keine variablen namen dafür .. oder nich oder doch? .. ich gebs auf ;-)

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: