Файлаас мөрийг хэрхэн устгах

Агуулгын хүснэгт:

Файлаас мөрийг хэрхэн устгах
Файлаас мөрийг хэрхэн устгах

Видео: Файлаас мөрийг хэрхэн устгах

Видео: Файлаас мөрийг хэрхэн устгах
Видео: Хөдөлдөггүй, тогтмол харагдах мөр багана тохируулах 2024, May
Anonim

PHP дээр бага хэмжээний өгөгдөлтэй ажиллахдаа мэдээллийн сан үүсгэх, түүнтэй скриптүүдийн харилцан үйлчлэлийг зохион байгуулахаас заримдаа файлд хадгалах нь илүү хялбар байдаг. Ийм тохиолдолд текстийн файлаас тодорхой мөрүүдийг устгах нь түгээмэл биш юм. Үүнийг хийх хамгийн энгийн аргыг нарийвчлан авч үзье.

PHP: файлаас мөрийг хэрхэн устгах
PHP: файлаас мөрийг хэрхэн устгах

Шаардлагатай

PHP-ийн талаархи анхан шатны мэдлэг

Зааварчилгаа

1-р алхам

Эхний өгөгдөл:

- бид олон тооны өгөгдлийн мөр агуулсан allStrings.txt текст файлтай

- файлын 44-р мөрийг устгах шаардлагатай

Асуудлыг шийдвэрлэх алгоритм нь дараах байдалтай байна: та файлыг нээж, дотор нь байгаа мөрүүдийг мөрийн мөр болгон уншиж, одоо байгаа файлыг массивын агуулгаар дарж, устгахаар төлөвлөсөн мөрийг алгасах хэрэгтэй.

Алхам 2

Энэхүү алгоритмыг скриптэд хэрэгжүүлэхийн тулд эхлээд эх файлын нэр, устгагдах мөрийн дугаарыг багтаасан хувьсагчуудад утга олгоно: $ fileName = "allStrings.txt";

$ lineToKill = 44; Дараа нь файлыг мөрийн массив болгон уншицгаая: $ stringsArray = file ($ fileName); Файлд бидэнд хэрэгтэй мөр байгаа эсэхийг шалгаж үзье. $ LineToKill нөхцөл нь $ stringsArray массив дахь мөрийн тооноос ихгүй тохиолдолд л бүх бусад кодыг гүйцэтгэх болно: if ($ lineToKill <= count ($ stringsArray)) {

// энэ нь програмын гол давталт болно

} Хэрэв нөхцөл хангагдаагүй бол бидэнд устгах зүйл байхгүй болно. Энэ талаар скриптэд мэдээллийн мессеж хэвлүүлээрэй: else echo "Файл дахь мөрийн тоо". $ LineToKill. "-Аас бага байна." Хэрэв нөхцөл хангагдсан бол та эх файлыг шинэ оруулгад цэвэрлэх хэрэгтэй: $ fileHandle = fopen ($ fileName, "w"); Одоо бид мөрийн массивын бүх элементүүд дээр давтагдах давталтыг зохион байгуулах хэрэгтэй. Гэхдээ массивын индексжүүлэлт нь тэгээс эхэлдэг тул бид устгах мөрийн дугаарыг нэгээс тоолсон тул давталт эхлэхээс өмнө бид энэ үйлдлийг алхам тутамд давтахгүйн тулд $ lineToKill-ийн утгыг нэгээр бууруулна. $ lineToKill -; Давталтыг зохион байгуулахын тулд: foreach ($ stringsArray as $ key => $ value) {

// давталтын алхам бүрийн код энд байна

} $ Key хувьсагч нь массив дахь тухайн мөрийн индексийг, $ value хувьсагч нь энэ мөрийн утгыг агуулна. Давталтын алхам бүрт бид массив дахь мөрийн индексийг устгах дугаартай харьцуулах бөгөөд хэрэв тэдгээр нь таарахгүй байвал бид энэ мөрийн утгыг файлд бичнэ: if ($ key! = $ LineToKill) fwrite ($ fileHandle, $ value); А нь хоорондоо таарч байвал бид файл руу бичихгүй, гэхдээ амжилттай устгасан тухай мессеж хэвлэ: "echo" Line ". $ LineToKill." Deleted. "; мөчлөгийн төгсгөлд файл руу бичиж дуусахад та эелдэгээр хаах хэрэгтэй: fclose ($ fileHandle);

Алхам 3

Бүрэн код нь дараах байдалтай байна: <? Php $ fileName = "allStrings.txt";

$ lineToKill = 44; $ stringsArray = файл ($ fileName);

хэрэв ($ lineToKill <= count ($ stringsArray)) {

$ fileHandle = fopen ($ fileName, "w");

$ lineToKill--;

foreach ($ stringsArray as $ key => $ value) {

хэрэв ($ key! = $ lineToKill) fwrite ($ fileHandle, $ value);

else echo "Line". $ lineToKill. "устгасан.";

}

fclose ($ fileHandle);

}?> Мэдээжийн хэрэг, энэ бол скриптийг бодит нөхцөлд ажиллуулах явцад гарч болох бүх хүндрэлээс хамгаалалтгүй хамгийн энгийн код юм. Жишээлбэл, хэрэв файлд олон тооны мөр байгаа бол тэдгээрийг массив болгон унших нь серверийн нөөцөөс нэг скриптэд зөвшөөрөгдөхгүй хэмжээтэй хэсгийг хазах болно. Мэдээжийн хэрэг, их хэмжээний өгөгдөлтэй ажиллах ажлыг текст файл биш мэдээллийн баазаар дамжуулан зохион байгуулах нь зүйтэй. Гэсэн хэдий ч боловсролын жишээн дээр бид энэ асуудлыг шийдсэн кодыг өгөх болно. Энд алгоритм нь өмнөхөөсөө өөр байх болно: массив дахь олон тооны мөрүүдийг хадгалахгүйн тулд скрипт нь эх файлаас нэг мөрийг нэг нэгээр нь уншаад түр зуурын файл руу нэг нэгээр нь бичнэ. Энэ процессын төгсгөлд анхны файлыг устгах бөгөөд түр файлыг байрандаа зөөх болно.

Алхам 4

Энэ скрипт нь өмнөхийнхтэй ижил аргаар эхэлнэ:

$ fileName = "allStrings.txt";

$ lineToKill = 44;

Дараа нь та ажиллахын тулд түр зуурын файл үүсгэх хэрэгтэй. Үүнийг "tmp" хавтсанд хийж, ижил угтварыг түр файлд өгье: $ tempFile = tempnam ("/ tmp", "tmp"); Одоо эх файлыг уншихаар нээгээд үзье: if ($ fileHandle = @fopen ($ fileName, "rb")) {

// эх файл хэвийн нээгдсэн тохиолдолд энэ кодыг гүйцэтгэх болно

} Хэрэв энэ нь бүтэлгүйтвэл скриптийн цаашдын ажил утгагүй болно, бид холбогдох мессежийг гарган процессыг устгана: else die ("Эх файл байхгүй!"); Хэрэв файл хэвийн нээгдсэн бол бид энэ тухай мэдэгдлийг хэвлээд өмнө нь үүсгэсэн түр зуурын файлыг харгалзах мессежээр нээхийг оролдох болно: echo "Эх файл байна";

if ($ tempHandle = fopen ($ tempFile, "w")) echo "Түр файл үүсгэсэн."; Одоо эх файлаас мөрүүдийг унших циклийг эхлүүлэх цаг болжээ. файл: while (! feof ($ fileHandle)) {

// энд одоогийн мөртэй ажиллах код байх болно

} Давталтын алхам бүрт бид нэг мөрийг унших болно: $ lineToWrite = fgets ($ fileHandle); Хэрэв энэ нь устгах мөр биш бол түр файл руу бичнэ үү. Шугамын тоолуур $ lineNum харьцуулах үйлдлээр шууд нэмэгдэх болно: if ($ lineToKill! = (++ $ lineNum)) fwrite ($ tempHandle, $ lineToWrite); Мөр дуусахад файлыг хаах: fclose ($ fileHandle));

fclose ($ tempHandle); Эцэст нь түр файлыг анхны файл болгон өөрчил. Хэрэв энэ ажиллагаа амжилттай болбол бид холбогдох мессежийг гаргана: if (rename ($ tempFile, $ fileName)) echo "$ lineToKill мөр устгагдсан";

Алхам 5

Бүрэн код:

<? php $ fileName = "allStrings.txt";

$ lineToKill = 44; $ tempFile = tempnam ("/ tmp", "tmp");

хэрэв ($ fileHandle = @fopen ($ fileName, "rb")) {

echo "Эх сурвалж файл байна";

хэрэв ($ tempHandle = fopen ($ tempFile, "w")) echo "Түр файл үүсгэсэн.";

}

else die ("Эх файл байхгүй!"); while (! feof ($ fileHandle)) {

$ lineToWrite = fgets ($ fileHandle);

хэрэв ($ lineToKill! = (++ $ lineNum)) fwrite ($ tempHandle, $ lineToWrite);

} fclose ($ fileHandle);

fclose ($ tempHandle);

хэрэв (нэрийг өөрчлөх ($ tempFile, $ fileName)) echo "Line $ lineToKill хасагдсан";?>

Зөвлөмж болгож буй: