PHP-де аз көлемдегі мәліметтермен жұмыс істегенде, оларды мәліметтер қорын құрудан және онымен сценарийлердің өзара әрекетін ұйымдастырудан гөрі оларды файлдарда сақтау кейде оңайырақ болады. Мұндай жағдайларда мәтіндік файлдан көрсетілген жолдарды жою міндеті сирек емес. Мұны жасаудың ең қарапайым әдісін егжей-тегжейлі қарастырайық.
Қажетті
PHP туралы негізгі білім
Нұсқаулық
1-қадам
Бастапқы мәліметтер:
- бізде бірқатар мәліметтер жолдары бар allStrings.txt мәтіндік файлы бар
- файлдан No44 жолды жою қажет
Есепті шешудің алгоритмі келесідей болады: файлды ашып, ондағы жолдарды жолдар массивіне оқып, жоюға арналған жолды өткізіп, бар файлды массивтің мазмұнымен қайта жазу керек.
2-қадам
Бұл алгоритмді сценарийде жүзеге асыру үшін алдымен бастапқы файлдың аты мен жойылатын жолдың нөмірін қамтитын айнымалыларға мән береміз: $ fileName = «allStrings.txt»;
$ lineToKill = 44; Содан кейін файлды жолдар массивінде оқып шығайық: $ stringsArray = file ($ fileName); Файлда бізге қажет жол бар-жоғын тексерейік. Барлық қосымша код тек $ lineToKill шарты $ stringsArray жиымындағы жолдар санынан көп болмаған жағдайда ғана орындалады: if ($ lineToKill <= count ($ stringsArray)) {
// бұл бағдарламаның негізгі циклі болады
} Егер шарт орындалмаса, онда бізде ешнәрсе жоқ. Бұл туралы сценарий ақпараттық хабарлама шығарсын: «echo» Файлдағы жолдар саны «.» $ LineToKill. «Аз!»; Егер шарт орындалса, сіз жаңа файл үшін бастапқы файлды өшіруіңіз керек: $ fileHandle = fopen ($ fileName, «w»); Енді жол массивінің барлық элементтерінде қайталанатын циклды ұйымдастыру керек. Бірақ массивті индекстеу нөлден басталатындықтан, біз оны жоюға арналған жол нөмірін бірден санағандықтан, цикл басталғанға дейін біз бұл әрекетті әр қадамда қайталамас үшін $ lineToKill мәнін біреуіне азайтамыз: $ lineToKill -; Ілмек ұйымдастыру үшін: foreach ($ stringsArray as $ key => $ value) {
// мұнда циклдің әрбір қадамының коды келтірілген
} $ Кілтінің айнымалысы массивтегі ағымдағы жолдың индексін, ал $ мәнінің айнымалысы осы жолдың мәнін қамтиды. Циклдің әр қадамында біз массивтегі жолдың индексін жойылатын санмен салыстырамыз, ал егер олар сәйкес келмесе, онда бұл жолдың мәнін файлға жазамыз: if ($ key! = $ LineToKill) fwrite ($ fileHandle, $ value); А егер олар сәйкес келсе, онда біз файлға жазбаймыз, бірақ сәтті жою туралы хабарлама шығарамыз: әйтпесе «Line». $ LineToKill. «Жойылды.»; цикл аяқталғаннан кейін файлға жазу аяқталған кезде оны сыпайы түрде жабу керек: fclose ($ fileHandle);
3-қадам
Толық код келесідей болады: <? Php $ fileName = «allStrings.txt»;
$ lineToKill = 44; $ stringsArray = файл ($ fileName);
егер ($ lineToKill <= count ($ stringsArray)) {
$ fileHandle = fopen ($ fileName, «w»);
$ lineToKill--;
foreach ($ stringsArray as $ key => $ value) {
if ($ key! = $ lineToKill) fwrite ($ fileHandle, $ value);
else «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); Соңында, temp файлының түпнұсқасына өзгертіңіз. Егер бұл әрекет сәтті болса, онда біз тиісті хабарлама жібереміз: 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);
if (rename ($ tempFile, $ fileName)) echo «Line $ lineToKill жойылды»;?>