azok: element aus array entfernen

hi!

ich bastle wieder mal an meinem weblog herum. - und zwar eine 'funktion' zum löschen von beiträgen, welches ich mir so vorgestellt habe:

"ausgangsdatei" sperren - "ausgangsdatei" in array mittels file() zeilenweise einlesen - lokale datei anlegen - über for-schleife(?) array der "ausgangsdatei" durchgehen. in dieser ist eine abfrage eingebaut, die abfrägt, ob das element im array vorkommt. wenn ja, dann wird die gesamte zeile aus dem array gelöscht. - das 'bereinigte' array wird nun in der lokalen datei gespeichert. - "ausgangsdatei" entsperren - "ausgangsdatei" wird gelöscht - lokale datei wird in den namen der "ausgangsdatei" umbenannt

so ähnlich habe ich mir das vorgestellt. mein problem ist es nun das betreffende element aus dem array zu löschen bisher habe ich den codeabschnitt soweit:

$comment_id = $_GET['id'];
$file = "datei.dat";
$file_array = file($file);

for($i=count($file_array)-1; $i>=0; $i--)
{
  if(in_array($comment_id, $file_array)
  {
    #...#
  }
}

wie mache ich an der markierten stelle weiter? wahrscheinlich über unset(). - aber wie ermittle ich den index des elements im array, um ihn zu löschen?

wäre über hilfe dankbar

lg
azok

--
Murphys Law: "Alles Schöne im Leben ist entweder illegal, ungesetzlich oder es macht dick."
Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:( n4:° ss:| de:] js:| ch:( sh:) mo:) zu:)
  1. Hello,

    wie und wo sperrst Du?
    File() ist eigentlich ungeeignet.
    Vermutlich wirst Du bei Flatfiles sowieso fgetcsv() benötigen, wenn Du nicht sogar lieber ein Random Access File aufbaust. Da kann man dann direkt das Handle von fopen() hernehmen zum Sperren.

    Außerdem solltest Du bei Verwendung von Arrays lieber foreach() benutzen, und dann eben nach dem Treffer z.B. einfach die Schleife mit break abbrechen.

    Das Arbeiten mit Arrays setzt i.d.R. das vollständige Einlesen des Files voraus, woraus sich in der Praxis meistens eine Größenbeschränkung von ca. <2MB für das File ergibt.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. hi!

      [...]Größenbeschränkung von ca. <2MB für das File ergibt.

      ist dann so eine löschfunktion überhaupt sinnvoll?

      lg
      azok

      --
      Murphys Law: "Alles Schöne im Leben ist entweder illegal, ungesetzlich oder es macht dick."
      Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:( n4:° ss:| de:] js:| ch:( sh:) mo:) zu:)
      1. Hello,

        [...]Größenbeschränkung von ca. <2MB für das File ergibt.

        ist dann so eine löschfunktion überhaupt sinnvoll?

        Das hängt doch ganz von Deinen Vorgaben und Einstellungen ab.
        Wenn Du natürlich eine Random-Access-Datei aufbaust nach dem Muster http://selfhtml.bitworks.de/artikel_locking/adressen.php.txt
        dann kann die schon sehr groß werden, auch mit PHP. Die einzige Beschränkung ist dann nur noch das Filesystem und die API von PHP.

        Da kannst Du dann nicht mehr jeden Satz einzeln löschen, sondern markierst die nur zur Löschung und beim nächsten Aufräumen werden sie dann einfach nicht mit umkopiert.

        Harzliche Grüße aus http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
  2. echo $begrueszung;

    for($i=count($file_array)-1; $i>=0; $i--)
    {
      if(in_array($comment_id, $file_array)

    in_array() suchst schon selbständig über das ganze Array. Eine Schleife brauchst du da nicht.
    in_array liefert aber nur eine Aussage, ob der Wert im Array enthalten ist. array_search() liefert dir den passenden Schlüssel, dann kannst du mit unset($file_array[$key]) den Eintrag entfernen.

    Allerdings könnte ich mir vorstellen, dass du nicht nach dem exakten Vorkommen des Suchwertes im Array suchst, sondern ob der Suchwert ein Teilstring eines Array-Elements ist. Dann ist ein foreach und strpos() der richtige Weg:

    foreach($array as $key => $value)  
      if (strpos($value, $tosearchfor) !== false)  // beachte das !== (Vergleich mit Typprüfung)  
        unset($array[$key]  
    
    

    Achso... foreach sucht natürlich nicht rückwärst, falls das deine Absicht war. Aber da gibt es array_reverse(), das die Reihenfolge der Elemente umdrehen kann...

    echo "$verabschiedung $name";