Implode und unset vertragen sich nicht?

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

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

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 :astonished:
das tut si aber leider…
vlt. weiss jemand, was ich meine^^

mfg Joey

Ein arrayelement lässt sich mit unset nicht entfernen, dazu verwendet man array_splice.

aha

:smiley: danke!
es tut zwar nun nicht ganz, aber der rest dürfte sich dann wohl von mir erledigen lassen :smiley:

mfg Joey

doch doch, ein Array Element lässt sich ohne Probleme mit unset entfernen :slight_smile:

Stimmt, hast Recht.

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.

achso :slight_smile:
Ja, ich hole das ganze mit file aus der datei…
in diesem falle, vielen dank, nun tut das nähmlich auch :slight_smile:
(zumindes lokal bei mir :ps: )

mfg Joey