PHP में एसोसिएटिव या सीक्वेंशियल ऐरे कैसे चेक करें: टॉप गलतियाँ और समाधान
\n\nक्या आपने कभी foreach लिखा और उल्टा रिजल्ट मिला? या फिर किसी फंक्शन को ऐरे भेजा जो लिस्ट की उम्मीद कर रहा था, लेकिन उसे स्ट्रिंग कीज़ वाला एसोसिएटिव ऐरे मिल गया? अगर हाँ, तो आप अकेले नहीं हैं। Stack Overflow पर "How to check if PHP array is associative or sequential?" सबसे ज़्यादा देखे जाने वाले सवालों में से एक है, जिसके हज़ारों व्यूज़ हैं। और यह कोई संयोग नहीं: PHP डेवलपर्स के लिए ऐरे टाइप्स में कन्फ्यूज़न एक बड़ी समस्या है।
इस आर्टिकल में हम जानेंगे कि एसोसिएटिव और सीक्वेंशियल ऐरे में क्या अंतर है, सबसे आम गलतियाँ क्या हैं, और उनके काम करने वाले समाधान क्या हैं। चलिए शुरू करते हैं!
\n\nसीक्वेंशियल और एसोसिएटिव ऐरे क्या होते हैं?
\n\nPHP में Python या JavaScript की तरह 'लिस्ट' और 'डिक्शनरी' का सख्त विभाजन नहीं है। एक ही टाइप array दोनों का काम कर सकता है। लेकिन प्रैक्टिकल लाइफ में फर्क समझना ज़रूरी है:
- \n
- सीक्वेंशियल (sequential) ऐरे — कीज़ क्रम में होती हैं: 0, 1, 2, 3... बिना कोई गैप के। उदाहरण:
['सेब', 'नाशपाती', 'चेरी']। \n - एसोसिएटिव ऐरे — कीज़ स्ट्रिंग या बेतरतीब नंबर होते हैं। उदाहरण:
['नाम' => 'राहुल', 'उम्र' => 30]। \n
सुनने में आसान लगता है, है ना? लेकिन प्रैक्टिस में डेवलपर्स अक्सर ऐरे का टाइप मैन्युअली पहचानने में गलती कर बैठते हैं। आइए सबसे कॉमन गलतियों पर नज़र डालते हैं।
\n\nटॉप गलती #1: array_keys() का इस्तेमाल करके range से तुलना करना
\n\nसबसे आम तरीका है — ऐरे की सारी कीज़ निकालना, 0 से count($array)-1 तक एक सीक्वेंस बनाना, और दोनों को कंपेयर करना। यह तार्किक लगता है, लेकिन इसमें कुछ पेच हैं।
// गलत तरीके का उदाहरण\nfunction isSequential($arr) {\n return array_keys($arr) === range(0, count($arr) - 1);\n}\n\n$test = ['a', 'b', 'c'];\nvar_dump(isSequential($test)); // true — सही\n\n$test2 = ['x' => 1, 'y' => 2];\nvar_dump(isSequential($test2)); // false — सही\n\n$test3 = [0 => 'a', 2 => 'b'];\nvar_dump(isSequential($test3)); // false — सही\n\n$test4 = ['0' => 'a', '1' => 'b'];\nvar_dump(isSequential($test4)); // ??? \n\n\nसमस्या यह है कि PHP अपने आप स्ट्रिंग कीज़ को इंटीजर में बदल देता है, अगर वे नंबर जैसी दिखती हैं। ['0' => 'a', '1' => 'b'] असल में एक सीक्वेंशियल ऐरे है, लेकिन हमारा फंक्शन सख्त तुलना (===) की वजह से अनपेक्षित रिजल्ट दे सकता है।
निष्कर्ष: यह तरीका तभी काम करता है जब आप कीज़ के टाइप के बारे में पूरी तरह आश्वस्त हों। प्रोडक्शन के लिए ज़्यादा भरोसेमंद तरीकों का इस्तेमाल करें।
\n\nटॉप गलती #2: सिर्फ पहली की चेक करना
\n\nकुछ डेवलपर्स सोचते हैं: "अगर पहली की 0 है, तो ऐरे सीक्वेंशियल है।" यह एक खतरनाक ग़लतफ़हमी है।
\n\nfunction isSequentialByFirstKey($arr) {\n if (empty($arr)) return true;\n return array_key_first($arr) === 0;\n}\n\n$bad = [0 => 'a', 'name' => 'राहुल'];\nvar_dump(isSequentialByFirstKey($bad)); // true — जबकि false होना चाहिए!\n\n\nपहली की 0 है, लेकिन ऐरे साफ़ तौर पर एसोसिएटिव है। ऐसी चेकिंग मिक्स्ड ऐरे को पकड़ नहीं पाएगी, जो रियल प्रोजेक्ट्स में अक्सर मिलते हैं।
\n\nनिष्कर्ष: कभी भी सिर्फ पहले एलिमेंट के आधार पर ऐरे का फैसला न करें। सारी कीज़ चेक करें।
\n\nटॉप गलती #3: खाली ऐरे को नज़रअंदाज़ करना
\n\nखाली ऐरे [] — क्या यह सीक्वेंशियल है या एसोसिएटिव? PHP के नज़रिए से, दोनों। लेकिन कुछ फंक्शन इसमें गड़बड़ कर देते हैं।
function isAssociative($arr) {\n return count(array_filter(array_keys($arr), 'is_string')) > 0;\n}\n\nvar_dump(isAssociative([])); // false — खाली ऐरे एसोसिएटिव नहीं है\nvar_dump(isAssociative([1, 2, 3])); // false — सही\n\n\nयह तार्किक लगता है, लेकिन अगर आप उम्मीद कर रहे हैं कि यह फंक्शन खाली ऐरे के लिए true लौटाए (जैसे कि वह एसोसिएटिव हो), तो आप गलत हैं। खाली ऐरे एक विशेष मामला है।