PHP- ում փոքր քանակությամբ տվյալների հետ աշխատելիս երբեմն ավելի հեշտ է դրանք ֆայլերում պահել, քան տվյալների բազա ստեղծել և դրա հետ սցենարների փոխազդեցություն կազմակերպել: Նման դեպքերում տեքստային ֆայլից նշված տողերը ջնջելու խնդիրը հազվադեպ չէ: Եկեք ավելի սերտ նայենք դա անելու հնարավոր ամենապարզ եղանակին:
Անհրաժեշտ է
PHP- ի հիմնական գիտելիքներ
Հրահանգներ
Քայլ 1
Նախնական տվյալներ.
- մենք ունենք allStrings.txt տեքստային ֆայլ, որը պարունակում է մի շարք տվյալների տողեր
- պահանջվում է ֆայլից ջնջել թիվ 44 տողը
Խնդրի լուծման ալգորիթմը կլինի հետևյալը. Անհրաժեշտ է բացել ֆայլը, կարդալ դրա մեջ պարունակվող տողերը տողերի շարքում և գոյություն ունեցող ֆայլը վերաշարադրել զանգվածի պարունակությամբ ՝ շրջանցելով ջնջվող տողը:
Քայլ 2
Այս ալգորիթմը սցենարում իրականացնելու համար մենք նախ արժեքներ ենք հատկացնում փոփոխականներին, որոնք պարունակում են աղբյուրի ֆայլի անվանումը և ջնջվող տողի համարը. $ FileName = "allStrings.txt";
$ lineToKill = 44; Ապա եկեք կարդանք ֆայլը տողերի զանգվածում. $ stringsArray = ֆայլ ($ fileName); Եկեք ստուգենք, արդյոք ֆայլը պարունակում է մեզ անհրաժեշտ տող: Հետագա բոլոր ծածկագրերը կկատարվեն միայն այն դեպքում, եթե $ lineToKill պայմանը ոչ ավելի է, քան $ stringsArray զանգվածի տողերի քանակը. If ($ lineToKill <= count ($ stringsArray)) {
// սա կլինի ծրագրի հիմնական օղակը
} Եթե պայմանը չի բավարարվում, ապա մենք ջնջելու բան չունենք: Թող սցենարը տեղեկատվական հաղորդագրություն տպի այս մասին. Հակառակ դեպքում արձագանքեք "Ֆայլում տողերի քանակը պակաս է". $ LineToKill. "!": Եթե պայմանը բավարարված է, դուք պետք է մաքրեք աղբյուրի ֆայլը նոր գրառման համար ՝ $ fileHandle = fopen ($ fileName, "w"); Այժմ մենք պետք է կազմակերպենք մի օղակ, որը կրկնվում է լարային զանգվածի բոլոր տարրերի վրա: Բայց քանի որ զանգվածի ինդեքսավորումը սկսվում է զրոյից, և մենք հաշվել ենք տողի համարը մեկից ջնջելու համար, ապա նույնիսկ օղակի մեկնարկից առաջ մենք մեկով կնվազեցնենք $ lineToKill արժեքը, որպեսզի այս գործողությունը չկրկնվի ամեն քայլափոխի. $ lineToKill -; Օղակ կազմակերպելու համար. foreach ($ stringsArray as $ key => $ value) {
// ահա օղակի յուրաքանչյուր քայլի կոդը
} $ Ստեղնային փոփոխականը պարունակում է զանգվածում ընթացիկ տողի ինդեքս, իսկ $ value փոփոխականը `այս տողի արժեք: Օղակի յուրաքանչյուր քայլին մենք համեմատելու ենք զանգվածի տողի ինդեքսը ջնջվող համարի հետ, և եթե դրանք չեն համընկնում, ապա այս տողի արժեքը ֆայլում կգրենք ՝ if ($ key! = $ LineToKill) fwrite ($ fileHandle, $ value); Ա եթե դրանք համընկնում են, ապա մենք ֆայլին չենք գրելու, բայց հաջող ջնջման մասին հաղորդագրություն ենք տպելու. Else echo "Line". $ LineToKill. "Ջնջված է"; և theիկլի վերջում, երբ ֆայլում գրությունն ավարտված է, պետք է քաղաքավարիորեն փակել այն. fclose ($ fileHandle);
Քայլ 3
Ամբողջական կոդն այսպիսի տեսք կունենա. <? Php $ fileName = "allStrings.txt";
$ lineToKill = 44; $ stringsArray = ֆայլ ($ fileName);
եթե ($ lineToKill <= հաշվել ($ stringsArray)) {
$ fileHandle = fopen ($ fileName, "w");
$ lineToKill--;
foreach ($ stringsArray as $ key => $ value) {
եթե ($ ստեղն! = $ lineToKill) գրեք ($ fileHandle, $ արժեք);
other echo "Line". $ lineToKill. "ջնջված է";
}
fclose ($ fileHandle);
}?> Իհարկե, սա ամենապարզ ծածկագիրն է, որում իրական պաշտպանություն չկա բոլոր բարդություններից, որոնք կարող են տեղի ունենալ սցենարի աշխատանքի ընթացքում: Օրինակ, եթե ֆայլը պարունակում է հսկայական քանակությամբ տողեր, ապա դրանք զանգված ընտրելով կկտտացնի սերվերի ռեսուրսներից անթույլատրելիորեն մեծ մի կտոր: Իհարկե, մեծ քանակությամբ տվյալների հետ աշխատանքը պետք է կազմակերպվի տվյալների բազաների, այլ ոչ թե տեքստային ֆայլերի միջոցով: Բայց, այնուամենայնիվ, որպես կրթական օրինակ, մենք կտանք մի ծածկագիր, որը լուծում է նաև այս խնդիրը: Այստեղ ալգորիթմը կտարբերվի նախորդից. Զանգվածում հսկայական քանակությամբ տողեր չպահելու համար սցենարը միանգամից մեկ տող կկարդա աղբյուրի ֆայլից և դրանք մեկ առ մեկ կգրարկի ժամանակավոր ֆայլին: Այս գործընթացի ավարտին բնօրինակ ֆայլը կջնջվի, իսկ ժամանակավոր ֆայլը կտեղափոխվի իր տեղը:
Քայլ 4
Այս սցենարը կսկսվի այնպես, ինչպես նախորդը.
$ fileName = "allStrings.txt";
$ lineToKill = 44;
Դրանից հետո աշխատելու համար հարկավոր է ստեղծել ժամանակավոր ֆայլ: Եկեք անենք դա «tmp» պանակում և նույն նախածանցը տանք ժամանակավոր ֆայլին. $ TempFile = tempnam ("/ tmp", "tmp"); Հիմա եկեք փորձենք բացել աղբյուրի ֆայլը ընթերցման համար. If ($ fileHandle = @fopen ($ fileName, "rb")) {
// այս կոդը կկատարվի աղբյուրի ֆայլը նորմալ բացելու դեպքում
} Եթե դա ձախողվի, սցենարի հետագա աշխատանքը իմաստ չունի, մենք ոչնչացնում ենք գործընթացը համապատասխան հաղորդագրության թողարկման միջոցով. Else die («Սկզբնաղբյուրը գոյություն չունի!»); Եթե ֆայլը սովորաբար բացվել է, ապա մենք այս մասին ծանուցում կթողարկի և կփորձի համապատասխան հաղորդագրությամբ բացել նախկինում ստեղծված ժամանակավոր ֆայլը. echo "Source ֆայլը գոյություն ունի";
եթե ($ tempHandle = fopen ($ tempFile, "w")) echo "Ստեղծվել է ժամանակավոր ֆայլ"; Հիմա ժամանակն է սկզբնաղբյուր ֆայլից սկսել ընթերցման տողերի մի օղակ, որը կշարունակվի մինչև այն ֆայլը ՝ while (! feof ($ fileHandle)) {
// այստեղ կլինի ընթացիկ գծի հետ աշխատելու կոդը
} Օղակի յուրաքանչյուր քայլին մենք կընթերցենք մեկ տող. $ LineNum տողի հաշվիչը կավելացվի անմիջապես համեմատության գործողության մեջ. If ($ lineToKill! = (++ $ lineNum)) fwrite ($ tempHandle, $ lineToWrite); տողերն ավարտվելուն պես փակեք ֆայլը. Fclose ($ fileHandle);
fclose ($ tempHandle); Վերջապես, վերանվանեք temp ֆայլը սկզբնականի վրա: Եթե այս գործողությունը հաջող է, ապա մենք կուղարկենք համապատասխան հաղորդագրություն. Եթե (վերանվանել ($ tempFile, $ fileName)) echo "$ lineToKill տողը ջնջված է";
Քայլ 5
Լրիվ ծածկագիր
<? php $ fileName = "allStrings.txt";
$ lineToKill = 44; $ tempFile = tempnam ("/ tmp", "tmp");
եթե ($ fileHandle = @fopen ($ fileName, "rb")) {
echo «Աղբյուրի ֆայլը գոյություն ունի»;
if ($ tempHandle = fopen ($ tempFile, "w")) echo "Temամանակավոր ֆայլ է ստեղծվել";
}
else die («Աղբյուրի ֆայլը գոյություն չունի»); մինչդեռ (! feof ($ fileHandle)) {
$ lineToWrite = fgets ($ fileHandle);
if ($ lineToKill! = (++ $ lineNum)) fwrite ($ tempHandle, $ lineToWrite);
} fclose ($ fileHandle);
fclose ($ tempHandle);
if (վերանվանել ($ tempFile, $ fileName)) echo "Line $ lineToKill հանվել է";?>