Saat bekerja dengan sejumlah kecil data di PHP, terkadang lebih mudah untuk menyimpannya dalam file daripada membuat database dan mengatur interaksi skrip dengannya. Dalam kasus seperti itu, tugas menghapus baris tertentu dari file teks tidak jarang. Mari kita lihat lebih dekat cara termudah untuk melakukan ini.
Diperlukan
Pengetahuan dasar tentang PHP
instruksi
Langkah 1
Data awal:
- kami memiliki file teks allStrings.txt, yang berisi sejumlah baris data
- diperlukan untuk menghapus baris No. 44 dari file
Algoritme untuk menyelesaikan masalah adalah sebagai berikut: Anda perlu membuka file, membaca baris yang ada di dalamnya ke dalam array string dan menimpa file yang ada dengan konten array, melewatkan baris yang dimaksudkan untuk dihapus.
Langkah 2
Untuk mengimplementasikan algoritme ini dalam skrip, pertama-tama kita menetapkan nilai ke variabel yang akan berisi nama file sumber dan jumlah baris yang akan dihapus: $ fileName = "allStrings.txt";
$ lineToKill = 44; Kemudian mari kita baca file ke dalam array string: $ stringsArray = file ($ fileName); Mari kita periksa apakah file berisi baris yang kita butuhkan. Semua kode selanjutnya hanya akan dieksekusi jika kondisi $ lineToKill tidak lebih dari jumlah baris dalam array $ stringsArray: if ($ lineToKill <= count ($ stringsArray)) {
// ini akan menjadi loop utama program
} Jika kondisi tidak terpenuhi, maka tidak ada yang perlu kita hapus. Biarkan skrip mencetak pesan informasi tentang ini: else echo "Jumlah baris dalam file kurang dari". $ LineToKill. "!"; Jika kondisi terpenuhi, Anda harus menghapus file sumber untuk entri baru: $ fileHandle = fopen ($ fileName, "w"); Sekarang kita harus mengatur loop yang mengulangi semua elemen array string. Tetapi karena pengindeksan array dimulai dari nol, dan kami menghitung nomor baris untuk dihapus dari satu, maka bahkan sebelum dimulainya loop, kami akan mengurangi nilai $ lineToKill satu per satu, agar tidak mengulangi operasi ini di setiap langkah: $ lineToKill -; Untuk mengatur loop: foreach ($ stringsArray as $ key => $ value) {
// di sini adalah kode dari setiap langkah loop
} Variabel kunci $ akan berisi indeks baris saat ini dalam array, dan variabel nilai $ akan berisi nilai baris ini. Pada setiap langkah loop, kami akan membandingkan indeks baris dalam array dengan nomor yang akan dihapus, dan jika tidak cocok, maka kami akan menulis nilai baris ini ke file: if ($ key! = $ LineToKill) fwrite ($ fileHandle, $ value); jika cocok, maka kami tidak akan menulis ke file, tetapi mencetak pesan tentang penghapusan yang berhasil: else echo "Line". $ lineToKill. "deleted."; Dan di akhir siklus, ketika penulisan ke file selesai, Anda harus menutupnya dengan sopan: fclose ($ fileHandle);
Langkah 3
Kode lengkapnya akan terlihat seperti ini: <? Php $ fileName = "allStrings.txt";
$ lineToKill = 44; $ stringsArray = file ($ namafile);
if ($ lineToKill <= count ($ stringsArray)) {
$ fileHandle = fopen ($ namafile, "w");
$ lineToKill--;
foreach ($ stringsArray as $ key => $ value) {
if ($ key! = $ lineToKill) fwrite ($ fileHandle, $ nilai);
else echo "Baris". $ lineToKill. "dihapus.";
}
fclose ($ fileHandle);
}?> Tentu saja, ini adalah kode yang paling sederhana, di mana tidak ada perlindungan terhadap semua komplikasi yang dapat terjadi selama skrip bekerja dalam kondisi nyata. Misalnya, jika file berisi sejumlah besar baris, maka membacanya ke dalam array akan menggigit potongan yang sangat besar untuk satu skrip dari sumber daya server. Tentu saja, pekerjaan dengan data dalam jumlah besar harus diatur melalui database, bukan file teks. Tapi tetap saja, sebagai contoh pendidikan, kami akan memberikan kode yang memecahkan masalah ini juga. Di sini algoritme akan berbeda dari yang sebelumnya: agar tidak menyimpan sejumlah besar baris dalam array, skrip akan membaca dari file sumber satu baris pada satu waktu dan menulisnya satu per satu ke file sementara. Di akhir proses ini, file asli akan dihapus, dan file sementara akan dipindahkan ke tempatnya.
Langkah 4
Skrip ini akan dimulai dengan cara yang sama seperti yang sebelumnya:
$ namafile = "allStrings.txt";
$ lineToKill = 44;
Maka Anda perlu membuat file sementara agar berfungsi. Mari kita lakukan di folder "tmp" dan berikan awalan yang sama untuk file sementara: $ tempFile = tempnam ("/ tmp", "tmp"); Sekarang mari kita coba buka file sumber untuk dibaca: if ($ fileHandle = @fopen ($ namafile, " rb ")) {
// kode ini akan dieksekusi jika file sumber dibuka secara normal
} Jika ini gagal - pekerjaan skrip lebih lanjut tidak masuk akal, kami mematikan proses dengan mengeluarkan pesan yang sesuai: else die ("File sumber tidak ada!"); Jika file dibuka secara normal, maka kami akan mencetak pemberitahuan tentang ini dan mencoba membuka file sementara yang dibuat sebelumnya dengan pesan yang sesuai: echo "File sumber ada";
if ($ tempHandle = fopen ($ tempFile, "w")) echo "File sementara telah dibuat."; Sekarang saatnya untuk memulai loop membaca baris dari file sumber, yang akan berlanjut hingga mencapai akhir file: while (! feof ($ fileHandle)) {
// di sini akan menjadi kode untuk bekerja dengan baris saat ini
} Pada setiap langkah loop, kita akan membaca satu baris: $ lineToWrite = fgets ($ fileHandle); Dan jika ini bukan baris yang akan dihapus, maka tulislah ke file sementara. Penghitung baris $ lineNum akan bertambah secara langsung dalam operasi perbandingan: if ($ lineToKill! = (++ $ lineNum)) fwrite ($ tempHandle, $ lineToWrite); Ketika baris habis, tutup file: fclose ($ fileHandle);
fclose ($ tempHandle); Terakhir, ganti nama file temp menjadi yang asli. Jika operasi ini berhasil, maka kami akan mengeluarkan pesan yang sesuai: if (rename ($ tempFile, $ fileName)) echo "Baris $ lineToKill telah dihapus";
Langkah 5
Kode lengkap:
<?php $ namafile = "allStrings.txt";
$ lineToKill = 44; $ tempFile = tempnam("/ tmp", "tmp");
if ($ fileHandle = @fopen ($ namafile, "rb")) {
echo "Sumber file ada";
if ($ tempHandle = fopen ($ tempFile, "w")) echo "File sementara telah dibuat.";
}
else die("Sumber file tidak ada!"); while (!feof ($fileHandle)) {
$ lineToWrite = fgets ($ fileHandle);
if ($ lineToKill! = (++ $ lineNum)) fwrite ($ tempHandle, $ lineToWrite);
} fclose ($ fileHandle);
fclose ($ tempHandle);
if (ganti nama ($ tempFile, $ fileName)) echo "Baris $ lineToKill dihapus";?>