PHP में ऐरे की प्रतिलिपि: सरल असाइनमेंट या क्लोन?

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

PHP में ऐरे की गहरी प्रतिलिपि: मिथक और वास्तविकता

\n\n

एक स्थिति की कल्पना करें: आप एक स्क्रिप्ट लिख रहे हैं जो डेटाबेस से डेटा प्रोसेस करती है। आप उपयोगकर्ताओं की एक ऐरे प्राप्त करते हैं, उसके साथ कुछ करते हैं, और फिर अचानक पाते हैं कि मूल डेटा बदल गया है। परिचित लगता है? यदि आप PHP के साथ काम करते हैं, तो यह समस्या एक अनुभवी डेवलपर को भी चौंका सकती है।

\n\n

प्रश्न «Is there a function to make a copy of a PHP array to another?» ने Stack Overflow पर हजारों व्यूज प्राप्त किए हैं। और यह कोई संयोग नहीं है। पहली नज़र में, ऐसा लगता है कि PHP में ऐरे कॉपी करना एक सामान्य कार्य है। लेकिन शैतान, हमेशा की तरह, विवरण में छिपा है।

\n\n

इस लेख में, हम PHP में ऐरे कॉपी करने के सभी संभावित तरीकों का विश्लेषण करेंगे: सरल असाइनमेंट से लेकर बहुआयामी संरचनाओं के साथ काम करने तक। आप जानेंगे कि PHP कब वास्तविक प्रतिलिपि बनाता है, और कब केवल डेटा का संदर्भ। चलिए शुरू करते हैं!

\n\n

प्रत्यक्ष असाइनमेंट: पहला आश्चर्य

\n\n

सबसे सहज तरीका है कि ऐरे को बस दूसरे वेरिएबल में असाइन कर दें:

\n\n
$original = ['apple', 'banana', 'cherry'];\n$copy = $original;\n$copy[0] = 'mango';\n\nprint_r($original);\n// Array ( [0] => apple [1] => banana [2] => cherry )\nprint_r($copy);\n// Array ( [0] => mango [1] => banana [2] => cherry )
\n\n

आश्चर्यजनक रूप से, यह काम करता है! PHP में, ऐरे value types (मान प्रकार) हैं, संदर्भ प्रकार नहीं। जब आप एक ऐरे को दूसरे वेरिएबल में असाइन करते हैं, तो PHP सतही प्रतिलिपि (shallow copy) बनाता है जिसमें विलंबित प्रतिलिपि (copy-on-write) होती है।

\n\n

सरल शब्दों में: जब तक आप किसी भी ऐरे को नहीं बदलते, वे मेमोरी में एक ही डेटा की ओर इशारा करते हैं। जैसे ही आप किसी एक वेरिएबल में किसी एलिमेंट को बदलने का प्रयास करते हैं, PHP नई मेमोरी आवंटित करता है और डेटा कॉपी करता है। यह बहुत कुशल है और इसमें अतिरिक्त कार्रवाई की आवश्यकता नहीं है।

\n\n

निष्कर्ष: सरल एक-आयामी ऐरे के लिए, प्रत्यक्ष असाइनमेंट एक पूर्ण प्रतिलिपि है।

\n\n

छिपा हुआ पत्थर: ऐरे के अंदर ऑब्जेक्ट

\n\n

अब कल्पना करें कि ऐरे में ऑब्जेक्ट हैं:

\n\n
class User {\n    public $name;\n    public function __construct($name) {\n        $this->name = $name;\n    }\n}\n\n$original = [new User('Alice'), new User('Bob')];\n$copy = $original;\n$copy[0]->name = 'Charlie';\n\nprint_r($original[0]->name); // Charlie
\n\n

यह रहा आश्चर्य! सतही प्रतिलिपि ने ऑब्जेक्ट के संदर्भ को कॉपी किया, न कि स्वयं ऑब्जेक्ट को। प्रतिलिपि में ऑब्जेक्ट को बदलने से, आप मूल में भी उसे बदल देते हैं। ऑब्जेक्ट के लिए एक अलग दृष्टिकोण की आवश्यकता है।

\n\n

फ़ंक्शन array_merge(): गैर-स्पष्ट बारीकियाँ

\n\n

अक्सर ऐरे कॉपी करने के लिए array_merge() का उपयोग करने की सलाह दी जाती है:

\n\n
$original = [1, 2, 3];\n$copy = array_merge([], $original);\n$copy[0] = 100;\n\nprint_r($original); // [1, 2, 3]
\n\n

हाँ, यह काम करता है। लेकिन एक महत्वपूर्ण बारीकी है: array_merge() संख्यात्मक कुंजियों को रीसेट करता है और उन्हें शून्य से पुनः क्रमांकित करता है। यदि आपकी कुंजियाँ स्ट्रिंग हैं, तो सब कुछ ठीक है। लेकिन यदि वे संख्यात्मक हैं, तो आश्चर्य के लिए तैयार रहें:

\n\n
$original = ['a' => 1, 2 => 'two', 5 => 'five'];\n$copy = array_merge([], $original);\n\nprint_r($copy);\n// Array ( [a] => 1 [0] => two [1] => five )
\n\n

देखा? कुंजियाँ 2 और 5, 0 और 1 में बदल गईं। यदि कुंजियों का क्रम महत्वपूर्ण है, तो यह तर्क को तोड़ सकता है।

\n\n

निष्कर्ष: array_merge() केवल स्ट्रिंग कुंजियों वाली ऐरे कॉपी करने के लिए उपयुक्त है, या जब पुनः अनुक्रमणिका से कोई समस्या न हो।

\n\n

लूप का उपयोग करके प्रतिलिपि: मैन्युअल नियंत्रण

\n\n

सबसे विश्वसनीय, लेकिन सबसे अधिक शब्दयुक्त तरीका है ऐरे पर लूप चलाना:

\n\n
$original = ['x' => 10, 'y' => 20];\n$copy = [];\n\nforeach ($original as $key => $value) {\n    $copy[$key] = $value;\n}\n\n$copy['x'] = 100;\nprint_r($original['x']); // 10
\n\n

सरल ऐरे के लिए यह अतिरिक्त है। लेकिन यदि आपको गहरी प्रतिलिपि (deep copy) बनानी है, तो पुनरावृत्ति के बिना

ब्लॉग

पुस्तक अनुशंसाएँ