bcg
17. November 2008 um 19:55
1
hallo,
ich habe ein “klienes” skript geschrieben, welches unteranderem eine datei und eine Zeile aus einer anderen datei löschen soll.
das löschen der datei geht auch wunderbar.
Jedoch wird die Zeile nicht vollstöndig entfernt.
hier ein bisschen code:
..
foreach($pgs as $pg) {
$pg = explode("||", $pg);
if($pg[1] == $_GET["pdel"]) {
unset($pgs[$i]);
unlink("Image/text/". $_GET["pdel"] .".dat");
file_put_contents("Image/text/.index", implode("\r\n", $pgs));
$d = true;
}
$i++;
}
...
vlt. weiss ja jemand von euch, worans liegt…
mfg Joey
Balmung
17. November 2008 um 20:18
2
Wenn du foreach benutzt, brauchst du keine Zählervariable zusätzlich angeben,
das geht einfacher:
..
foreach($pgs as $i => $pg) {
$pg = explode("||", $pg);
if($pg[1] == $_GET["pdel"]) {
unset($pgs[$i]);
unlink("Image/text/". $_GET["pdel"] .".dat");
file_put_contents("Image/text/.index", implode("\r\n", $pgs));
$d = true;
}
}
...
dadurch fällt auch das $i++ weg.
Außerdem würde ich das file_put_contents ans ende, NACH der schleife packen, z.B. so:
..
$filechanged = false;
foreach($pgs as $i => $pg) {
$pg = explode("||", $pg);
if($pg[1] == $_GET["pdel"]) {
unset($pgs[$i]);
unlink("Image/text/". $_GET["pdel"] .".dat");
$d = true;
$filechanged = true;
}
}
if($filechanged) //so wird die Datei auch wirklich nur geschrieben, wenn eine Veränderung stattfand
{
file_put_contents("Image/text/.index", implode("\r\n", $pgs));
} //bei else könnte man sowas wie "Eintrag nicht gefunden" ausgeben
...
hoffe das hilft.
mfg Balmung
bcg
18. November 2008 um 11:31
3
ok, danke,
nun, das ergebnis ist immer noch das selbe:
.index vorher:
test||3||
test2||4||
test3||5||
.index nachher:
[code]test||3||
test3||5||[/code]
eigentlich sollte ja die leere variabel, die mit unset “gelöscht” wurde durch implode nicht mehr verwendet werden
das tut si aber leider…
vlt. weiss jemand, was ich meine^^
mfg Joey
piratos
18. November 2008 um 11:41
4
Ein arrayelement lässt sich mit unset nicht entfernen, dazu verwendet man array_splice.
bcg
18. November 2008 um 11:49
5
aha
danke!
es tut zwar nun nicht ganz, aber der rest dürfte sich dann wohl von mir erledigen lassen
mfg Joey
Balmung
18. November 2008 um 12:17
6
doch doch, ein Array Element lässt sich ohne Probleme mit unset entfernen
Balmung
18. November 2008 um 12:57
8
ich glaub ich hab das Problem entdeckt.
@bcg wichtige Frage: holst du die Daten, d.h. die einzelnen Zeilen mithilfe von file() ab?
wenn ja, dann lass bei implode den glue weg, also einfach nur:
implode(’’, $pgs);
Das problem ist nämlich, dass file() die Zeilen INKLUSIVE der Zeilenumbrüche am Ende ausliest.
d.h. im array hast du dann:
0 => "test||3||\r\n"
1 => "test2||4||\r\n"
2 => "test3||5||\r\n"
wenn du dann test2 entfernst, bleibt übrig:
0 => "test||3||\r\n"
2 => "test3||5||\r\n"
fügst du diese mit implode("\r\n", $pgs) zusammen, hast du als string:
test||3||\r\n
\r\n
test3||5||\r\n
Ergo: einen doppelten Zeilenumbruch.
bcg
22. November 2008 um 12:58
9
achso
Ja, ich hole das ganze mit file aus der datei…
in diesem falle, vielen dank, nun tut das nähmlich auch
(zumindes lokal bei mir )
mfg Joey