2017-05-18 2 views
-1

Ich gewöhne mich an PHP und versuche, eine Zeile aus einer Datei zu entfernen (falls vorhanden) und die Datei erneut zu speichern.Entfernen Sie eine Zeile aus der Datei, wenn sie existiert

Also, wenn ich die Datei hatte

user1 
user2 
user3 
user4 

I

if(existsAndRemove("user3")){ 
    do thing 
} 

verwenden könnte ich versucht habe Code ähnlich dem folgenden Code, aber es manchmal Fehler und wird nur eine Zeile entfernen, wenn Es ist das letzte in der Datei. Ich habe keine Ahnung, wie ich das beheben kann.

$data2 = file("./ats.txt"); 
$out2 = array(); 
foreach($data2 as $line2) { 
    if(trim($line2) != $acc) { 
     $out2[] = $line2; 
    } 
} 
$fp2 = fopen("./ats.txt", "w+"); 
flock($fp2, LOCK_EX); 
foreach($out2 as $line2) { 
    fwrite($fp2, $line2); 
} 
flock($fp2, LOCK_UN); 
fclose($fp2); 
    } 
}  

überhaupt Hilfe sehr geschätzt werden würde, und ich würde auch freuen, wenn Sie auch den Code erklären können, so konnte ich leichter daraus lernen !! Danke.

+0

Die geöffnete Datei überschreiben oder als neue Datei speichern? – Arbels

+1

es sieht so aus, als hätten Sie '$ acc' nicht definiert, dh' $ acc = "user3"; ' – cmorrissey

+0

@Arbels Überschreibt die Datei, sorry. –

Antwort

1

Wenn die Dateigröße so klein ist, dass Sie nicht befürchten müssen, alles in den Speicher zu schreiben, y Sie könnten etwas Funktionelleres tun

// Read entire file in as array of strings 
$data = file("./ats.txt"); 

// Some text we want to remove 
$acc = 'user3'; 

// Filter out any lines that match $acc, 
// ignoring any leading or trailing whitespace 
// 
$filtered_data = array_filter(
    $data, 
    function ($line) use ($acc) { 
     return trim($line) !== $acc; 
    } 
) 

// If something changed, write the file back out 
if ($filtered_data !== $data) { 
    file_put_contents('./ats.txt', implode('', $filtered_data)); 
} 
0

So etwas wie dies funktionieren könnte:

function remove_user($user) { 
    $file_path = "foo.txt" 
    $users = preg_split("[\n\r]+", file_get_contents($file_path)); 
    foreach ($users as $i => $existing) { 
     if ($user == $existing) { 
      $users = array_splice($users, $i, 1); 
      file_put_contents($file_path, implode("\n", $users)); 
      break; 
     } 
    } 
} 
0

sollte viel einfacher sein, da Sie bereits file() mit:

$data2 = file("./ats.txt", FILE_IGNORE_NEW_LINES); 
unset($data2[array_search('user3', $data2)]); 
file_put_contents("./ats.txt", implode("\n", $data2)); 

oder zu überprüfen, ob es zuerst vorhanden:

$data2 = file("./ats.txt", FILE_IGNORE_NEW_LINES); 

if(($key = array_search('user3', $data2)) !== false) { 
    unset($data2[$key]); 
    file_put_contents("./ats.txt", implode("\n", $data2)); 
} 
Verwandte Themen