Array Felder loeschen und sortieren

Array Felder loeschen und sortieren

am 13.09.2006 20:04:53 von Rainer Wahl

Ich habe hier eine Blockade in meinen Gehirnwindungen. Nach meinem
Verständnis hin sollte es funktionieren, was es aber nicht 100%ig tut,
sondern nur 90%ig, was aber nicht geht...

Es soll eine Art Zugangsberechtigung eingebaut werden in der Art, daß
in einer Datei Name, Codezahl, Mailadresse und die (System)Zeit des
eintragens geschrieben wird.

Jetzt möchte ich in einem PHP-File überprüfen, ob die Zeit länger her
ist als x Minuten.

Also User trägt sich ein und es werden die erwähnten Daten in eine
Datei geschrieben. Später überprüfe ich dann, ob der Eintrag zu alt ist
und wenn ja, wird der Eintrag aus der Datei gelöscht.

Mein Code dazu:

// Codefile oeffnen und auslesen
$file = fopen ("$codefile","r");
flock ($file, LOCK_EX); // andere Zugriffe abblocken
$inhaltcode = unserialize(file_get_contents ($codefile));
fclose($file);

// Pruefen ob das Codewort aelter als 24 Stunden ist.
for ($x=0;$x {
// Ist die Verfallszeit ueberschritten?
if(($inhaltcode["zeit"][$x]+$verfallzeit) < time())
{
// Passt der eingegebene Name zum verfallenen Codewort, dann
// gib einen Hinweis aus.
if (strpos($inhaltcode["name"][$x],$_POST['name'])!==false)
{
echo "Dein Codewort ist abgelaufen!";
};

// Wenn nur 1 Element "zeit" in der Datei ist und die
// Verfallszeit ueberschritten ist,
// dann kann die ganze Datei in den Muell.
if (count($inhaltcode["zeit"])==1)
{
$loeschen=1;
break;
};

// Elemente loeschen.
unset($inhaltcode["name"][$x]);
unset($inhaltcode["codezahl"][$x]);
unset($inhaltcode["email"][$x]);
unset($inhaltcode["zeit"][$x]);
};
};

// Das ganze endgueltig Speichern, wenn "loeschen" nicht gesetzt
// ist.
if (isset($loeschen))
{
unlink($codefile);
}
else
{
// Array mit fortlaufendem Index vor dem Speichern erzeugen
$new_inhaltcode = array ("name" => array (), "codezahl" =>
array(), "email" => array(), "zeit" => array());
$new_inhaltcode["name"] = array_values($inhaltcode["name"]);
$new_inhaltcode["codezahl"] =
array_values($inhaltcode["codezahl"]);
$new_inhaltcode["email"] = array_values($inhaltcode["email"]);
$new_inhaltcode["zeit"] = array_values($inhaltcode["zeit"]);

$file = fopen ("$codefile","w");
fwrite($file,serialize($inhaltcode));
flock ($file, LOCK_UN); // Datei freigeben
fclose($file);
};

Der erste Fehler:
Der Code löscht mir z.B. bei drei Einträgen in der Datei, die alle drei
von der Zeit her abgelaufen sind immer nur die ersten zwei. Der
dritte Eintrag fliegt dann erst im nächsten aufrufen des Codes raus und
zwar wenn die Variable $loeschen gesetzt ist und die Datei mit unlink
gelöscht wird.

Der zweite Fehler:
Eigentlich sollte das Array nach dem Löschen neu indiziert werden.
Werden jedoch von drei Einträgen zwei gelöscht, steht bei dem dritten
Eintrag nach wie vor [2] als Index und nicht [0] wie es nach dem neu
Indizieren eigetnlich sein sollte.

Vielleicht findet hier jemand den oder die Bugs. Von der Logik her
finde ich einfach nichts mehr...


-=( Rainer )=-

--
Ich verwende die kostenlose Version von BRAINfighter,
die bei mir bis jetzt 907 Gehirnzellen entfernt hat.
Für private Anwender ist BRAINfighter völlig sinnlos!
Jetzt gratis Lachen: hier klicken.

Re: Array Felder loeschen und sortieren

am 14.09.2006 01:34:41 von Hadanite Marasek

Mal eine kurze Zwischenfrage - wieso machst Du Dir selbst die Mühe und
schlägst Dich mit einem Flatfile rum, wenn es dba oder dbm gibt?

Gruss H. Marasek

Re: Array Felder loeschen und sortieren

am 14.09.2006 10:30:43 von Knut Kohl

Hallo Rainer,

Rainer Wahl schrieb am 13. Sep 2006 in de.comp.lang.php.misc:

> // Codefile oeffnen und auslesen
> $file = fopen ("$codefile","r");
> flock ($file, LOCK_EX); // andere Zugriffe abblocken
> $inhaltcode = unserialize(file_get_contents ($codefile));
> fclose($file);

> // Pruefen ob das Codewort aelter als 24 Stunden ist.
> for ($x=0;$x
schlechte Performance, jedesmal count() zu machen, besser:

for ($x=count($inhaltcode["zeit"])-1;$x>=0;$x--)

> {
> // Ist die Verfallszeit ueberschritten?
> if(($inhaltcode["zeit"][$x]+$verfallzeit) < time())
> {
> // Passt der eingegebene Name zum verfallenen Codewort, dann
> // gib einen Hinweis aus.
> if (strpos($inhaltcode["name"][$x],$_POST['name'])!==false)
> {
> echo "Dein Codewort ist abgelaufen!";
> };

das "$loeschen" brauchst du garnicht, geht einfacher, s.u.

> // Elemente loeschen.
> unset($inhaltcode["name"][$x]);
> unset($inhaltcode["codezahl"][$x]);
> unset($inhaltcode["email"][$x]);
> unset($inhaltcode["zeit"][$x]);
> };
> };

> // Das ganze endgueltig Speichern, wenn "loeschen" nicht gesetzt
> // ist.

// Das ganze löschen, wenn "Rest-Array" leer ist...
if (empty($inhaltcode["zeit"]))
> {
> unlink($codefile);
> }
> else
> {
> // Array mit fortlaufendem Index vor dem Speichern erzeugen
> $new_inhaltcode = array ("name" => array (), "codezahl" =>
> array(), "email" => array(), "zeit" => array());
> $new_inhaltcode["name"] = array_values($inhaltcode["name"]);
> $new_inhaltcode["codezahl"] =
> array_values($inhaltcode["codezahl"]);
> $new_inhaltcode["email"] = array_values($inhaltcode["email"]);
> $new_inhaltcode["zeit"] = array_values($inhaltcode["zeit"]);

> $file = fopen ("$codefile","w");
> fwrite($file,serialize($inhaltcode));
> flock ($file, LOCK_UN); // Datei freigeben
> fclose($file);
> };

> Der erste Fehler:
> Der Code löscht mir z.B. bei drei Einträgen in der Datei, die alle drei
> von der Zeit her abgelaufen sind immer nur die ersten zwei. Der
> dritte Eintrag fliegt dann erst im nächsten aufrufen des Codes raus und
> zwar wenn die Variable $loeschen gesetzt ist und die Datei mit unlink
> gelöscht wird.

eben auch ein count()-Problem:

array mit 4 Einträgen:

1. Schleife x=0 count=4 Eintrag ok.
2. Schleife x=1 count=4 Eintrag wird gelöscht
3. Schleife x=2 count=3 <= bereits LETZTER Durchlauf!! (2<3)
4. Schleife x=3 count=3 wird NIE abgearbeitet!

Deshalb bei solchen Manipulationen IMMER von hinten durchlaufen!

> Der zweite Fehler:
> Eigentlich sollte das Array nach dem Löschen neu indiziert werden.
> Werden jedoch von drei Einträgen zwei gelöscht, steht bei dem dritten
> Eintrag nach wie vor [2] als Index und nicht [0] wie es nach dem neu
> Indizieren eigetnlich sein sollte.

Verstehe ich auch nicht, sollte funktionieren, auch bei numerischem
Index.
$a = array ( 1=>1, 4=>4);
print_r($a);
print_r(array_values($a));

> Vielleicht findet hier jemand den oder die Bugs. Von der Logik her
> finde ich einfach nichts mehr...

> -=( Rainer )=-

Knut

--

Newsoffice.de - Die Onlinesoftware zum Lesen und Schreiben im Usenet

Re: Array Felder loeschen und sortieren

am 14.09.2006 21:30:05 von Rainer Wahl

Knut Kohl schrieb am 14 Sep 2006:

> schlechte Performance, jedesmal count() zu machen, besser:
> for ($x=count($inhaltcode["zeit"])-1;$x>=0;$x--)

Das ganze rückwärts aufzurollen ist mir noch nicht in den Sinn
gekommen. Guter Ansatz!

BTW bin ich davon ausgegangen, daß die for-Schleife nur einmal am
Anfang ihre Werte initialisiert die ihr vorgegeben werden und somit
count() nur einmal am Anfang ausgeführt wird. Wie ich aber gestern noch
durch etwas ausprobieren heraus fand, unterlag ich da wohl einem
Irglauben.

[...]
> Deshalb bei solchen Manipulationen IMMER von hinten durchlaufen!

Danke für die Tipps! Die helfen mir schon einmal weiter.

> Verstehe ich auch nicht, sollte funktionieren, auch bei
> numerischem Index.
> $a = array ( 1=>1, 4=>4);
> print_r($a);
> print_r(array_values($a));

Den Fehler mit dem unsortierten Array, obwohl vorher neu sortiert wurde
habe ich gefunden. Ich Depp habe das Array zwar neu sortiert und frisch
indizieren lassen, habe dann aber das alte Array abgespeichert und
nicht das neu sortierte. Somit hatte ich dann immer wieder ein Array
mit "löchern" drin trotz Sortieren.


-=( Rainer )=-

--
Ich verwende die kostenlose Version von BRAINfighter,
die bei mir bis jetzt 907 Gehirnzellen entfernt hat.
Für private Anwender ist BRAINfighter völlig sinnlos!
Jetzt gratis Lachen: hier klicken.

Re: Array Felder loeschen und sortieren

am 14.09.2006 21:30:06 von Rainer Wahl

Hadanite Marasek schrieb am 14 Sep 2006:

> Mal eine kurze Zwischenfrage - wieso machst Du Dir selbst die Mühe
> und schlägst Dich mit einem Flatfile rum, wenn es dba oder dbm
> gibt?

Flatfile? DBA? DBM?

..
..
..

Aha, nach einem kurzen Googlen eine Datenbank. Nunja, ich könnte auch
auf eine Datenbank mittels SQL zugreifen. Aber ich wollte das gerne
selber machen mittels Textdatei.


-=( Rainer )=-

--
Ich verwende die kostenlose Version von BRAINfighter,
die bei mir bis jetzt 907 Gehirnzellen entfernt hat.
Für private Anwender ist BRAINfighter völlig sinnlos!
Jetzt gratis Lachen: hier klicken.

Re: Array Felder loeschen und sortieren

am 14.09.2006 22:01:17 von Ulf Kadner

Rainer Wahl wrote:

>>schlechte Performance, jedesmal count() zu machen, besser:
>> for ($x=count($inhaltcode["zeit"])-1;$x>=0;$x--)
> Das ganze rückwärts aufzurollen ist mir noch nicht in den Sinn
> gekommen. Guter Ansatz!

hier noch einer zum staunen ;-)

for ($i=0, $j=sizeof($array); $i<$j; $i++) { /*staun*/ }

MfG, Ulf

Re: Array Felder loeschen und sortieren

am 14.09.2006 22:33:17 von Claus Reibenstein

Ulf Kadner schrieb:

> hier noch einer zum staunen ;-)
>
> for ($i=0, $j=sizeof($array); $i<$j; $i++) { /*staun*/ }

-v

Gruß. Claus

Re: Array Felder loeschen und sortieren

am 14.09.2006 22:58:31 von Ulf Kadner

Claus Reibenstein wrote:

>>hier noch einer zum staunen ;-)
> -v

OK. ;-) ist ein Smiley und markiert etwas als Späßchen.

Mann kanns allerdings auch als Bereich von Semikolon ; bis Klammer )
betrachten.

Jetz bessa? :-)

MfG, Ulf

Re: Array Felder loeschen und sortieren

am 14.09.2006 23:50:47 von Claus Reibenstein

Ulf Kadner schrieb:

> Claus Reibenstein wrote:
>
>>> hier noch einer zum staunen ;-)
>> -v

Darauf bezog sich das nicht, sondern auf die Zeile, die Du wohlweislich
_nicht_ gequotet hast.

> OK. ;-) ist ein Smiley und markiert etwas als Späßchen.

Genau da beginnt das Problem: _welches_ Späßchen?

> Mann kanns allerdings auch [...]

.... bewusst alles missverstehen und auf etwas antworten, was nicht
gefragt war ...

> Jetz bessa? :-)

Nein.

Gruß. Claus

Re: Array Felder loeschen und sortieren

am 15.09.2006 08:51:11 von Ulf Kadner

Claus Reibenstein wrote:

> Genau da beginnt das Problem: _welches_ Späßchen?

Wo ist bitte Dein Problem? Lass Dich mal behandeln!

EOD

Re: Array Felder loeschen und sortieren

am 15.09.2006 09:16:42 von Claus Reibenstein

Ulf Kadner schrieb:

> Claus Reibenstein wrote:
>
>> Genau da beginnt das Problem: _welches_ Späßchen?
>
> Wo ist bitte Dein Problem?

Mein Problem? Ich habe kein Problem. Jedenfalls keines, das Dich etwas
angehen könnte.

Ich verstehe einfach nur den Witz in Deinem "Späßchen" nicht. Und Du
bist scheinbar nicht in der Lage, ihn zu erklären.

> Lass Dich mal behandeln!

Es gibt keinen Grund, frech zu werden!

> EOD

Ignoriert. Sorry, aber wenn Du mir so daher kommst, musst Du mit einer
Antwort rechnen.

Fup2p gesetzt.

Gruß. Claus

Re: Array Felder loeschen und sortieren

am 15.09.2006 11:04:24 von Helmut Chang

Claus Reibenstein schrieb:

>>> Genau da beginnt das Problem: _welches_ Späßchen?
>> Wo ist bitte Dein Problem?
>
> Mein Problem? Ich habe kein Problem.

Doch, hast du (und das ist jetzt nicht bös gemeint), glaube ich: Mein
Glaskugel verrät mir, dass du Ulfs Code-Zeile

for ($i=0, $j=sizeof($array); $i<$j; $i++) {

nicht verstanden hast und erklärt haben wolltest.

Und Ulf hat das Problem, dass er dich diesbezüglich nicht verstanden hat.

Und beide habt ihr das Problem, dass ihr das Wort "Problem" negativ besetzt.

> Fup2p gesetzt.

Ignoriert.

gruss, heli

Re: Array Felder loeschen und sortieren

am 15.09.2006 13:49:15 von Claus Reibenstein

Helmut Chang schrieb:

> Mein Glaskugel verrät mir, dass du Ulfs Code-Zeile
>
> for ($i=0, $j=sizeof($array); $i<$j; $i++) {
>
> nicht verstanden hast und erklärt haben wolltest.

Nicht ganz. Ich habe die Codezeile durchaus verstanden. So weit reichen
meine PHP-Kenntnisse noch. Nur was daran witzig sein soll, verstehe ich
nicht.

Ist aber eigentlich auch egal.

Gruß. Claus