PHP में कम मात्रा में डेटा के साथ काम करते समय, डेटाबेस बनाने और इसके साथ स्क्रिप्ट की बातचीत को व्यवस्थित करने की तुलना में उन्हें फाइलों में संग्रहीत करना कभी-कभी आसान होता है। ऐसे मामलों में, टेक्स्ट फ़ाइल से निर्दिष्ट पंक्तियों को हटाने का कार्य असामान्य नहीं है। आइए इसे करने के सबसे सरल संभव तरीके पर करीब से नज़र डालें।
ज़रूरी
PHP का बुनियादी ज्ञान
निर्देश
चरण 1
आरंभिक डेटा:
- हमारे पास एक टेक्स्ट फ़ाइल allStrings.txt है, जिसमें कई डेटा लाइनें हैं
- फ़ाइल से लाइन नंबर 44 को हटाना आवश्यक है
समस्या को हल करने के लिए एल्गोरिथ्म इस प्रकार होगा: आपको फ़ाइल को खोलने की आवश्यकता है, इसमें निहित पंक्तियों को स्ट्रिंग्स की एक सरणी में पढ़ें और मौजूदा फ़ाइल को सरणी की सामग्री के साथ अधिलेखित करें, हटाए जाने के लिए इच्छित लाइन को छोड़ दें।
चरण 2
स्क्रिप्ट में इस एल्गोरिथम को लागू करने के लिए, हम पहले वेरिएबल्स को मान प्रदान करते हैं जिसमें स्रोत फ़ाइल का नाम और हटाए जाने वाली लाइन की संख्या होगी: $ fileName = "allStrings.txt";
$ lineToKill = ४४; फिर फ़ाइल को स्ट्रिंग्स की एक सरणी में पढ़ते हैं: $stringsArray = file ($ fileName); आइए देखें कि क्या फ़ाइल में वह पंक्ति है जिसकी हमें आवश्यकता है। आगे के सभी कोड केवल तभी निष्पादित किए जाएंगे जब शर्त $ लाइनटॉकिल $ स्ट्रिंग्सएरे सरणी में लाइनों की संख्या से अधिक न हो: यदि ($ लाइनटॉकिल <= गिनती ($ स्ट्रिंग्सअरे)) {
// यह प्रोग्राम का मुख्य लूप होगा
} अगर शर्त पूरी नहीं होती है, तो हमारे पास हटाने के लिए कुछ भी नहीं है। स्क्रिप्ट को इस बारे में एक सूचनात्मक संदेश प्रिंट करने दें: अन्यथा "फ़ाइल में पंक्तियों की संख्या इससे कम है" गूंजें। $ LineToKill। "!"; यदि शर्त पूरी होती है, तो आपको एक नई प्रविष्टि के लिए स्रोत फ़ाइल को साफ़ करना चाहिए: $ fileHandle = fopen ($ fileName, "w"); अब हमें एक लूप व्यवस्थित करना चाहिए जो स्ट्रिंग सरणी के सभी तत्वों पर पुनरावृत्त हो। लेकिन चूंकि सरणी अनुक्रमण शून्य से शुरू होता है, और हमने एक से हटाने के लिए लाइन नंबर की गणना की है, फिर भी लूप की शुरुआत से पहले हम $ लाइनटॉकिल के मूल्य को एक से कम कर देंगे, ताकि हर कदम पर इस ऑपरेशन को दोहराया न जाए: $ lineToKill -; एक लूप व्यवस्थित करने के लिए: foreach ($stringsArray as $ key => $ value) {
// यहाँ लूप के प्रत्येक चरण का कोड है
} $ कुंजी चर में सरणी में वर्तमान पंक्ति का सूचकांक होगा, और $ मान चर में इस पंक्ति का मान होगा। लूप के प्रत्येक चरण में, हम हटाए जाने वाले नंबर के साथ सरणी में लाइन के इंडेक्स की तुलना करेंगे, और यदि वे मेल नहीं खाते हैं, तो हम इस लाइन का मान फ़ाइल में लिखेंगे: if ($ key! = $ LineToKill) fwrite ($ fileHandle, $ value); यदि वे मेल खाते हैं, तो हम फ़ाइल को नहीं लिखेंगे, लेकिन सफल विलोपन के बारे में एक संदेश प्रिंट करेंगे: अन्यथा "लाइन" गूंजें। $ लाइनटॉकिल। "हटाया गया।"; और चक्र के अंत में, जब फ़ाइल को लिखना समाप्त हो जाता है, तो आपको इसे विनम्रता से बंद कर देना चाहिए: fclose ($ fileHandle);
चरण 3
पूरा कोड इस तरह दिखेगा: <? Php $ fileName = "allStrings.txt";
$ लाइनटॉकिल = 44; $ स्ट्रिंग्सअरे = फ़ाइल ($ फ़ाइल नाम);
अगर ($ लाइनटॉकिल <= गिनती ($ स्ट्रिंग्सअरे)) {
$ fileHandle = fopen ($ fileName, "w");
$ लाइनटॉकिल--;
foreach ($ stringArray $ key => $ value के रूप में) {
अगर ($ key! = $ lineToKill) fwrite ($ fileHandle, $ value);
और इको "लाइन"। $ लाइनटॉकिल। "हटाया गया।";
}
एफक्लोज़ ($ फ़ाइलहैंडल);
}?> बेशक, यह सबसे सरल कोड है, जिसमें वास्तविक परिस्थितियों में स्क्रिप्ट के काम के दौरान होने वाली सभी जटिलताओं से कोई सुरक्षा नहीं है। उदाहरण के लिए, यदि किसी फ़ाइल में बड़ी संख्या में लाइनें हैं, तो उन्हें एक सरणी में पढ़ने से सर्वर संसाधनों से एक स्क्रिप्ट के लिए अनुमेय रूप से बड़े हिस्से को काट दिया जाएगा। बेशक, बड़ी मात्रा में डेटा के साथ काम डेटाबेस के माध्यम से व्यवस्थित किया जाना चाहिए, न कि टेक्स्ट फाइलों के माध्यम से। लेकिन फिर भी, एक शैक्षिक उदाहरण के रूप में, हम एक कोड देंगे जो इस समस्या को भी हल करता है। यहां एल्गोरिथ्म पिछले एक से अलग होगा: सरणी में बड़ी संख्या में लाइनों को संग्रहीत नहीं करने के लिए, स्क्रिप्ट एक समय में स्रोत फ़ाइल से एक पंक्ति को पढ़ेगी और उन्हें एक-एक करके अस्थायी फ़ाइल में लिखेगी। इस प्रक्रिया के अंत में, मूल फ़ाइल हटा दी जाएगी, और अस्थायी फ़ाइल को उसके स्थान पर ले जाया जाएगा।
चरण 4
यह स्क्रिप्ट पिछले वाले की तरह ही शुरू होगी:
$ fileName = "allStrings.txt";
$ लाइनटॉकिल = ४४;
फिर आपको काम करने के लिए एक अस्थायी फ़ाइल बनाने की आवश्यकता है। चलो इसे "tmp" फ़ोल्डर में करते हैं और अस्थायी फ़ाइल को वही उपसर्ग देते हैं: $ tempFile = tempnam ("/ tmp", "tmp"); अब आइए पढ़ने के लिए स्रोत फ़ाइल खोलने का प्रयास करें: if ($ fileHandle = @fopen ($ फ़ाइल नाम, "आरबी")) {
// स्रोत फ़ाइल के सामान्य उद्घाटन के मामले में यह कोड निष्पादित किया जाएगा
} यदि यह विफल हो जाता है - स्क्रिप्ट के आगे के काम का कोई मतलब नहीं है, तो हम इसी संदेश को जारी करने के साथ प्रक्रिया को मार देते हैं: अन्य मरो ("स्रोत फ़ाइल मौजूद नहीं है!"); यदि फ़ाइल सामान्य रूप से खोली गई थी, तो हम इस बारे में एक अधिसूचना मुद्रित करेगा और संबंधित संदेश के साथ पहले से बनाई गई अस्थायी फ़ाइल को खोलने का प्रयास करेगा: गूंज "स्रोत फ़ाइल मौजूद है";
अगर ($ tempHandle = fopen ($ tempFile, "w")) इको "एक अस्थायी फ़ाइल बनाई गई है।"; अब स्रोत फ़ाइल से रीडिंग लाइनों का एक लूप शुरू करने का समय है, जो तब तक जारी रहेगा जब तक कि यह अंत तक हिट न हो जाए फ़ाइल: जबकि (! feof ($ fileHandle)) {
// यहां वर्तमान लाइन के साथ काम करने के लिए कोड होगा
} लूप के प्रत्येक चरण पर, हम एक पंक्ति पढ़ेंगे: $lineToWrite = fgets ($fileHandle); और यदि यह हटाई जाने वाली रेखा नहीं है, तो इसे एक अस्थायी फ़ाइल में लिखें। लाइन काउंटर $ लाइननम को सीधे तुलना ऑपरेशन में बढ़ाया जाएगा: अगर ($ लाइनटॉकिल! = (++ $ लाइननम)) fwrite ($ tempHandle, $ lineToWrite); जब लाइनें खत्म हो जाती हैं, तो फ़ाइल बंद करें: fclose ($ fileHandle));
fclose ($ tempHandle); अंत में, अस्थायी फ़ाइल का नाम बदलकर मूल कर दें। यदि यह ऑपरेशन सफल होता है, तो हम एक संबंधित संदेश जारी करेंगे: यदि (नाम बदलें ($ tempFile, $ fileName)) गूंज "लाइन $ लाइनटॉकिल हटा दी गई है";
चरण 5
पूरा कोड:
<? php $ fileName = "allStrings.txt";
$ लाइनटॉकिल = 44; $ tempFile = tempnam ("/ tmp", "tmp");
अगर ($ fileHandle = @fopen ($ fileName, "rb")) {
गूंज "स्रोत फ़ाइल मौजूद है";
अगर ($ tempHandle = fopen ($ tempFile, "w")) गूंज "अस्थायी फ़ाइल बनाई गई है।";
}
अन्य मरें ("स्रोत फ़ाइल मौजूद नहीं है!"); जबकि (! feof ($ fileHandle)) {
$ lineToWrite = fgets ($ fileHandle);
अगर ($ लाइनटॉकिल! = (++ $ लाइननम)) fwrite ($ tempHandle, $ lineToWrite);
} fclose ($ fileHandle);
fclose ($ tempHandle);
अगर (नाम बदलें ($ tempFile, $ fileName)) इको "लाइन $ लाइनटॉकिल हटा दिया गया";?>