Файлдан сапты кантип алып салуу керек

Мазмуну:

Файлдан сапты кантип алып салуу керек
Файлдан сапты кантип алып салуу керек

Video: Файлдан сапты кантип алып салуу керек

Video: Файлдан сапты кантип алып салуу керек
Video: ПРЕСС ПОДБОРЩИК САТЫЛАТ👍 СРОЧНО АКЧА КЕРЕК 0775131093 2024, Ноябрь
Anonim

PHPде аз көлөмдөгү маалыматтар менен иштөөдө, кээде маалымат базасын түзүүдөн жана аны менен скрипттердин өз ара аракетин уюштургандан көрө, аларды файлдарда сактоо оңой. Мындай учурларда тексттик файлдан көрсөтүлгөн саптарды жок кылуу милдети сейрек эмес. Келгиле, муну жасоонун эң жөнөкөй жолун тереңирээк карап чыгалы.

PHP: файлдан сапты кантип алып салуу керек
PHP: файлдан сапты кантип алып салуу керек

Зарыл

PHP жөнүндө негизги билим

Нускамалар

1 кадам

Баштапкы маалыматтар:

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

- файлдан No44 сабын алып салуу талап кылынат

Маселени чечүүнүн алгоритми төмөнкүчө болот: файлды ачып, андагы саптарды массив катарына окуп, жок кылынууга тийиш болгон сапты аттап өтүп, массивдин мазмуну менен бар файлдын үстүнөн жазуу керек.

2-кадам

Бул алгоритмди сценарийде ишке ашыруу үчүн, баштапкы файлдын аталышы жана жок кылынган саптын номери камтылуучу өзгөрмөлөргө маани беребиз: $ fileName = "allStrings.txt";

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

// бул программанын негизги айлампасы болот

} Эгерде шарт аткарылбаса, анда бизде жок кыла турган эч нерсе жок. Скрипт бул тууралуу маалыматтык билдирүү басып чыгарсын: else " Файлдагы саптардын саны ". $ LineToKill." Аз! "Жаңырыгы; Эгер шарт аткарылса, анда жаңы жазуунун баштапкы файлын тазалашыңыз керек: $ fileHandle = fopen ($ fileName, "w"); Эми сап массивинин бардык элементтеринин үстүнөн кайталануучу цикл уюштурушубуз керек. Бирок массивди индекстөө нөлдөн башталгандыктан, биз аны жок кылуу үчүн катар номерин эсептегендиктен, цикл башталганга чейин дагы $ lineToKill маанисин бир кадамга төмөндөтөбүз, бул кадамды ар бир кадамда кайталабаш үчүн: $ lineToKill -; Укурукту уюштуруу үчүн: foreach ($ stringsArray as $ key => $ value) {

// бул жерде циклдин ар бир кадамынын коду келтирилген

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

3-кадам

Толук код төмөнкүдөй болот: <? Php $ fileName = "allStrings.txt";

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

if ($ lineToKill <= count ($ stringsArray)) {

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

$ lineToKill--;

foreach ($ stringsArray $ 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 "Source file has";

if ($ tempHandle = fopen ($ tempFile, "w")) echo "Убактылуу файл түзүлгөн" файл: while (! feof ($ fileHandle)) {

// бул жерде учурдагы сызык менен иштөө коду болот

} Циклдин ар бир кадамында биз бир сапты окуйбуз: $ lineToWrite = fgets ($ fileHandle); Эгерде бул жок кылынган сап болбосо, анда убактылуу файлга жазыңыз. Line line $ lineNum түздөн-түз салыштыруу иш-аракетинде көбөйтүлөт: if ($ lineToKill! = (++ $ lineNum)) fwrite ($ tempHandle, $ lineToWrite); Саптар бүткөндө файлды жабыңыз: fclose ($ fileHandle));

fclose ($ tempHandle); Акырында, temp файлынын атын баштапкыга өзгөртүңүз. Эгер бул иш ийгиликтүү болсо, анда биз тиешелүү билдирүү жөнөтөбүз: if (rename ($ tempFile, $ fileName)) echo "Line $ lineToKill жок кылынды";

5-кадам

Толук код:

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

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

if ($ fileHandle = @fopen ($ fileName, "rb")) {

echo "Булак файлы бар";

if ($ tempHandle = fopen ($ tempFile, "w")) echo "Убактылуу файл түзүлгөн.";

}

else die ("Булак файлы жок!"); while (! feof ($ fileHandle)) {

$ lineToWrite = fgets ($ fileHandle);

if ($ lineToKill! = (++ $ lineNum)) fwrite ($ tempHandle, $ lineToWrite);

} fclose ($ fileHandle);

fclose ($ tempHandle);

if (rename ($ tempFile, $ fileName)) echo "Line $ lineToKill алынып салынды";?>

Сунушталууда: