PHP ऐरे में किसी भी स्थान पर तत्व सम्मिलित करना: यह हुड के नीचे कैसे काम करता है
\n\nक्या आपने कभी ऐसी स्थिति का सामना किया है जहाँ आपको किसी नए तत्व को अंत में नहीं, बल्कि ऐरे के ठीक बीच में सम्मिलित करने की आवश्यकता हो? उदाहरण के लिए, वर्णमाला क्रम में सूची के बीच में एक उपयोगकर्ता जोड़ना या ब्लॉग में दूसरी और तीसरी पोस्ट के बीच एक विज्ञापन बैनर सम्मिलित करना। PHP में यह उन कार्यों में से एक है जो सरल लगता है, लेकिन करीब से देखने पर भाषा की आंतरिक यांत्रिकी की एक पूरी दुनिया खुल जाती है।
\n\nप्रश्न «Insert new item in array on any position in PHP» Stack Overflow पर एक वास्तविक हिट है। हजारों डेवलपर्स उत्तर खोजते हैं, और यह व्यर्थ नहीं है। इस लेख में, हम न केवल एक तैयार समाधान दिखाएंगे, बल्कि हुड के नीचे भी झाँकेंगे: मेमोरी में क्या होता है, क्यों array_splice राजा है, और कब अन्य दृष्टिकोणों का उपयोग करना बेहतर है। चलिए शुरू करते हैं!
समस्या का विवरण: «किसी भी स्थान पर सम्मिलित करने» का क्या अर्थ है?
\n\nकल्पना करें कि हमारे पास नामों की एक सरणी है:
\n\n$users = ['Alice', 'Bob', 'Charlie', 'David'];\n\nहम Bob के बाद नाम «Eve» सम्मिलित करना चाहते हैं, ताकि प्राप्त हो:
\n\n['Alice', 'Bob', 'Eve', 'Charlie', 'David']\n\nयह कितना आसान हो सकता है? लेकिन मानक फ़ंक्शन array_push और $array[] = केवल अंत में तत्व जोड़ सकते हैं। और array_unshift केवल शुरुआत में। बीच के लिए कुछ और चाहिए।
समाधान #1: array_splice — ऐरे का स्विस आर्मी चाकू
\n\nPHP ऐरे में किसी भी स्थान पर तत्व सम्मिलित करने का मुख्य उपकरण फ़ंक्शन array_splice है। आइए देखें कि यह व्यवहार में कैसे काम करता है।
<?php\n$fruits = ['apple', 'banana', 'cherry', 'date'];\narray_splice($fruits, 2, 0, 'blueberry');\nprint_r($fruits);\n?>\n\nपरिणाम:
\n\nArray\n(\n [0] => apple\n [1] => banana\n [2] => blueberry\n [3] => cherry\n [4] => date\n)\n\narray_splice के पैरामीटर को समझते हैं:
- \n
- $array — मूल ऐरे (संदर्भ द्वारा पारित किया जाता है, अर्थात यह स्थान पर बदल जाता है)। \n
- offset — वह स्थान जहाँ हम सम्मिलित करते हैं (हमारे उदाहरण में 2 वह इंडेक्स है जहाँ नया तत्व जाएगा, और पुराने दाईं ओर शिफ्ट हो जाएंगे)। \n
- length — हटाए जाने वाले तत्वों की संख्या। यदि 0 रखा जाए, तो हम कुछ भी नहीं हटाते — केवल सम्मिलित करते हैं। \n
- replacement — स्वयं नया तत्व (या तत्वों का ऐरे)। \n
यह एक सुरुचिपूर्ण समाधान है जो 99% मामलों को कवर करता है। लेकिन «हुड के नीचे» क्या होता है?
\n\narray_splice अंदरूनी रूप से कैसे काम करता है: शिफ्ट की यांत्रिकी
\n\nजब आप array_splice($array, 2, 0, $value) कॉल करते हैं, PHP कई चरण निष्पादित करता है:
- \n
- ऑफ़सेट की गणना: यदि offset ऋणात्मक है, तो इसे ऐरे के अंत से गिना जाता है। \n
- तत्वों का शिफ्ट: offset स्थिति से शुरू होने वाले सभी तत्व, सम्मिलित किए जाने वाले तत्वों की संख्या से दाईं ओर शिफ्ट हो जाते हैं। यह एक O(n) ऑपरेशन है — ऐरे जितना बड़ा होगा, उतना ही अधिक समय लगेगा। \n
- सम्मिलन: नया तत्व खाली हुई जगह पर रखा जाता है। \n
- पुनः-अनुक्रमण: यदि ऐरे संख्याओं द्वारा अनुक्रमित था, PHP कुंजियों की पुनर्गणना करता है ताकि वे क्रम में हों। \n
यह समझना महत्वपूर्ण है: PHP में ऐरे सरल सूचियाँ नहीं हैं, बल्कि हैश टेबल (ordered hash maps) हैं। इसलिए बीच में सम्मिलित करने के लिए मेमोरी में तत्वों के भौतिक स्थानांतरण की आवश्यकता होती है, जो प्रदर्शन को प्रभावित करता है। छोटे ऐरे (सौ तत्वों तक) के लिए यह ध्यान देने योग्य नहीं है, लेकिन लाखों रिकॉर्ड वाले ऐरे के लिए यह एक बाधा बन सकता है।
\n\nसमाधान #2: कई तत्वों के साथ array_splice
\n\nक्या होगा यदि आपको एक साथ कई तत्व सम्मिलित करने की आवश्यकता हो? array_splice इससे भी निपटता है:
<?php\n$numbers = [1, 2, 5, 6];\narray_splice($numbers, 2, 0, [3, 4]);\nprint_r($numb