Eindimensionales Array in mehrdimensionales umwandeln
Enrico
- php
Mahlzeit,
da ich kein SQL verwenden kann, im Rahmen der Möglichkeiten von Textdateien hier aber trotzdem flexibel sein muss, möchte ich aus einer Textdatei eingelesenen Inhalt (String) in ein mehrdimensionales Array der folgenden Form umwandeln:
Gaestebuch
|
+-> 0 -> Name
-> eMail
-> Homepage
-> Nachricht
-> Datum
-> Uhrzeit
-> IP
-> Token
-> Status
1 -> Name
-> eMail
-> Homepage
-> Nachricht
-> Datum
-> Uhrzeit
-> IP
-> Token
-> Status
usw.
Zugreifen möchte ich auf das Array beispielsweise über echo $Gaestebuch[2]['Name'].
Folgenden Ansatz habe ich derzeit:
for ($i = 0; $i < count ($Zeilen); $i++)
{
list ($Nr, $Name, $eMail, $Homepage, $Nachricht, $Datum, $Uhrzeit, $IP, $Token, $Status) = explode ("|#|", $Zeilen [$i]);
$Gaestebuch = array ($Nr => array ('Name' => $Name, 'eMail' => $eMail, 'Homepage' => $Homepage, 'Nachricht' => $Nachricht, 'Datum' => $Datum, 'Uhrzeit' => $Uhrzeit, 'IP' => $IP, 'Token' => $Token, 'Status' => $Status));
}
Es funktioniert soweit, außer, dass mir nur ein einziger Eintrag erzeugt wird.
var_dump ($Gaestebuch) liefert mir bei folgende Ausgabe:
array(1)
{
[10]=> array(9)
{
["Name"]=> string(6) "Enrico"
["eMail"]=> string(0) ""
["Homepage"]=> string(0) ""
["Nachricht"]=> string(21) "Dies ist nur ein Test"
["Datum"]=> string(10) "09.11.2011"
["Uhrzeit"]=> string(8) "21:57:29"
["IP"]=> string(3) "::1"
["Token"]=> string(32) "337049ecaf696d56067456f9223571b2"
["Status"]=> string(1) "1"
}
}
Das Einlesen der Textdatei und das Aufsplitten des eingelesenen Strings in einzelne Zeilen funktioniert einwandfrei, dies habe ich mit var_dump ($Zeilen) getestet.
Wo liegt mein Fehler?
Vielen Dank für eure Mithilfe.
Gruß
Enrico
Hello,
Du liest also eine Datei ein?
In Jeder "Zeile" der Datei steht ein Datensatz?
Dieser Datensatz ist immer vollständig? Es fehlen also keine Elemente und sind auch keine zuviel?
Das heißt: die Daten sind verlässlich.
Dann kannst Du zum Einlesen der Zeilenm z.B. auch fgetcsv() benutzen.
http://de.php.net/manual/en/function.fgetcsv.php
stelle leeres Superarray zur Verfügung
/Solange nicht eof()
(stelle leeres Array zur Verfügung)
lese Zeile aus Datei in ein Array ein
addiere Dieses Array als Element zu einem anderen hinzu
\eof()
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi,
da ich kein SQL verwenden kann,
Warum nicht?
Das wenigstens SQLite so gut wie immer zur Verfügung steht, ist dir bekannt?
Folgenden Ansatz habe ich derzeit:
for ($i = 0; $i < count ($Zeilen); $i++)
{
list ($Nr, $Name, $eMail, $Homepage, $Nachricht, $Datum, $Uhrzeit, $IP, $Token, $Status) = explode ("|#|", $Zeilen [$i]);$Gaestebuch = array ($Nr => array ('Name' => $Name, 'eMail' => $eMail, 'Homepage' => $Homepage, 'Nachricht' => $Nachricht, 'Datum' => $Datum, 'Uhrzeit' => $Uhrzeit, 'IP' => $IP, 'Token' => $Token, 'Status' => $Status));
}
Du bist eigentlich lange genug hier, um die [code]-Tags zu kennen – bitte verwende sie auch an den passenden Stellen!
> Es funktioniert soweit, außer, dass mir nur ein einziger Eintrag erzeugt wird.
Natürlich, weil du $Gaestebuch in jedem Schleifendurchlauf überschreibst.
> Wo liegt mein Fehler?
Im naiven rumbasteln mit Textdateien.
Dass das ganze hübsch knallt, wenn man jemand zufällig mal in einem der Eingabefelder die Zeichenkette |#| eingibt, die du zum trennen der Daten verwendest, ist dir hoffentlich klar.
MfG ChrisB
--
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
Hello,
Wo liegt mein Fehler?
Im naiven rumbasteln mit Textdateien.
Dass das ganze hübsch knallt, wenn man jemand zufällig mal in einem der Eingabefelder die Zeichenkette |#| eingibt, die du zum trennen der Daten verwendest, ist dir hoffentlich klar.
... oder einen "Zeilenumbruch" einbaut ...
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallo ChrisB & Tom,
danke für eure Antwort.
Natürlich, weil du $Gaestebuch in jedem Schleifendurchlauf überschreibst.
Logisch... :-/
$Gaestebuch = array ();
Außerhalb der Schleife definiert und in der Schleife $Gaestebuch [$Nr] = array ('Name' => $Name, ...);
notiert und schon klappt es.
in einem der Eingabefelder die Zeichenkette |#| eingibt
Das wird in der finalen "Fassung" natürlich unterbunden und gefiltert, ebenso wie Tags, Skriptangaben,...
Gruß
Enrico
Hello,
Natürlich, weil du $Gaestebuch in jedem Schleifendurchlauf überschreibst.
Logisch... :-/
$Gaestebuch = array ();
Außerhalb der Schleife definiert und in der Schleife
$Gaestebuch [$Nr] = array ('Name' => $Name, ...);
notiert und schon klappt es.in einem der Eingabefelder die Zeichenkette |#| eingibt
Das wird in der finalen "Fassung" natürlich unterbunden und gefiltert, ebenso wie Tags, Skriptangaben,...
Du kannst alles zulassen, wenn Du das CSV-File-Format von PHP benutzt.
Schau dir also nochmal die CSV-Funktionen von PHP an:
http://de.php.net/manual/en/function.fgetcsv.php
http://de.php.net/manual/en/function.fputcsv.php
Wenn die Datenmenge überschaubar bleibt, kannst Du auch gleich mit serialisierten Arrays arbeiten:
http://de.php.net/manual/en/function.serialize.php
http://de.php.net/manual/en/function.unserialize.php
Was aber unbedingt notwendig sein wird, wenn Du mit nativen Dateien arbeiten willst, ist die Konkurrenzbehandlung von Prozessen. Lese hierzu bitte
http://aktuell.de.selfhtml.org/artikel/programmiertechnik/dateisperren/
Es ist auch nicht umbedingt logisch, HTML-Elemente ("Tags") aus dem Text zu verbannen. Die musst Du nur vor der Wiedergabe im HTML-Umfeld kastrieren, wenn Du sie nicht haben willst.
Lese hierzu den Artikel von Dedlfix: http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel
Meinung:
Ich finde es zu Lernzwecken durchaus richtig, dass Du bei einem Gästebuch (einfache überschaubare Anwendung) mal versuchst, auf eine Datenbankmaschine zu verzichten. Wie sonst willst Du sonst lernen, was ein DBMS alles zu regeln hat?
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
![](http://selfhtml.bitworks.de/Virencheck.gif)
--
☻\_
/▌
/ \ Nur selber lernen macht schlau
<http://bergpost.annerschbarrich.de>
Nicht vergessen:
Der ganz böse fastix hat das hier einst vorgestellt
http://www.fastix.de/PHP-+Speichern+und+Lesen+von+Daten-+Arrays+in+und+aus+Dateien.htm
--
(Nein! Ich nenne meinen Name nicht!)
Mahlzeit,
beliebige_schleife {
$Gaestebuch = array ($Nr => array ('Name' => $Name, 'eMail' => $eMail, 'Homepage' => $Homepage, 'Nachricht' => $Nachricht, 'Datum' => $Datum, 'Uhrzeit' => $Uhrzeit, 'IP' => $IP, 'Token' => $Token, 'Status' => $Status));
}
print_r($Gaestebuch);
Das kann immer nur die letzte Zeile liefern. Du hast also einen logischen Fehler.
Richtig ist es einen Array zu verwenden, wo Du einen solchen brauchst:
$Gaestebuch[]=array();
beliebige_schleife {
$Gaestebuch[] = array ($Nr => array ('Name' => $Name, 'eMail' => $eMail, 'Homepage' => $Homepage, 'Nachricht' => $Nachricht, 'Datum' => $Datum, 'Uhrzeit' => $Uhrzeit, 'IP' => $IP, 'Token' => $Token, 'Status' => $Status));
}
print_r($Gaestebuch);
$Gaestebuch[]=array();
beliebige_schleife {
$Gaestebuch[] = array ($Nr => array ('Name' => $Name, 'eMail' => $eMail, 'Homepage' => $Homepage, 'Nachricht' => $Nachricht, 'Datum' => $Datum, 'Uhrzeit' => $Uhrzeit, 'IP' => $IP, 'Token' => $Token, 'Status' => $Status));
}
print_r($Gaestebuch);
Ich sehe gerade, Du hast da noch mehr Unsinn.
~~~php
$Gaestebuch[]=array();
beliebige_schleife {
$Gaestebuch[] = ('Name' => $Name, 'eMail' => $eMail, 'Homepage' => $Homepage, 'Nachricht' => $Nachricht, 'Datum' => $Datum, 'Uhrzeit' => $Uhrzeit, 'IP' => $IP, 'Token' => $Token, 'Status' => $Status);
}
print_r($Gaestebuch);
genügt. Wenn Du die $Nr zu brauchen meinst, dann schreib diese in die eckige Klammer:
$Gaestebuch[]=array();
beliebige_schleife {
$Gaestebuch[$Nr] = ('Name' => $Name, 'eMail' => $eMail, 'Homepage' => $Homepage, 'Nachricht' => $Nachricht, 'Datum' => $Datum, 'Uhrzeit' => $Uhrzeit, 'IP' => $IP, 'Token' => $Token, 'Status' => $Status);
}
print_r($Gaestebuch);
Da der "Doppelpost" gesperrt ist...
HEy, Enrico. Ich hoffe, Du lässt Dich nicht demotivieren. Viel Spass beim Programmieren weiterhin.
Bau eimal folgende var_dump() ein...
function Datei_einlesen ($Datei)
{
global $Meldung;
$Dateiname = @basename ($Datei);
if (!file_exists ($Datei))
{
$Meldung = 'Ausrufezeichen|Die Datei "' . $Dateiname . '" konnte nicht gefunden werden oder die Pfadangabe zur Datei ist falsch.<br><br>Bitte schicke uns eine kurze Mitteilung mit einer Fehlerbeschreibung. Wir werden uns bemühen, den Fehler umgehend zu beheben.<br><br>Vielen Dank im Voraus und trotzdem weiterhin viel Spaß auf unserer Homepage.|OK|VorherigeSeite';
}
else
{
echo 'Funktion "Datei_einlesen": Datei "' . $Dateiname . '" besteht<br>';
if (filesize ($Datei) === 0)
{
return array ('', 'Kein Inhalt');
}
else
{
echo 'Funktion "Datei_einlesen": Datei "' . $Dateiname . '" ist ' . filesize ($Datei) . ' Bytes groß<br>';
if (!is_readable ($Datei))
{
return array ('', 'Ausrufezeichen|Die Datei "' . $Dateiname . '" wurde als nicht lesbar zurückgemeldet.<br><br>Bitte schicke uns eine kurze Mitteilung mit einer Fehlerbeschreibung. Wir werden uns bemühen, den Fehler umgehend zu beheben.<br><br>Vielen Dank im Voraus und trotzdem weiterhin viel Spaß auf unserer Homepage.|OK|VorherigeSeite');
}
else
{
echo 'Funktion "Datei_einlesen": Datei "' . $Dateiname . '" ist lesbar<br>';
if (!$Zeiger = fopen ($Datei, "rb"))
{
return array ('', 'Ausrufezeichen|Die Datei "' . $Dateiname . '" konnte nicht zum Lesen geöffnet werden.<br><br>Bitte schicke uns eine kurze Mitteilung mit einer Fehlerbeschreibung. Wir werden uns bemühen, den Fehler umgehend zu beheben.<br><br>Vielen Dank im Voraus und trotzdem weiterhin viel Spaß auf unserer Homepage.|OK|VorherigeSeite');
}
else
{
echo 'Funktion "Datei_einlesen": Datei "' . $Dateiname . '" konnte zum Lesen geöffnet werden<br>';
if ($Inhalt = @fread ($Zeiger, filesize ($Datei)) === FALSE)
{
return array ('', 'Ausrufezeichen|Der Inhalt der Datei "' . $Dateiname . '" konnte nicht eingelesen werden.<br><br>Bitte schicke uns eine kurze Mitteilung mit einer Fehlerbeschreibung. Wir werden uns bemühen, den Fehler umgehend zu beheben.<br><br>Vielen Dank im Voraus und trotzdem weiterhin viel Spaß auf unserer Homepage.|OK|VorherigeSeite');
}
else
{
var_dump($Inhalt);
echo 'Funktion "Datei_einlesen": Datei "' . $Dateiname . '" konnte eingelesen werden<br>';
fclose ($Zeiger);
$Zeilen = explode ("[ENDE]", $Inhalt);
var_dump($Zeilen);
return array ($Zeilen, 'Kein Fehler');
}
}
}
}
}
}