एसोसिएटिव ऐरे को सॉर्ट करना क्यों है मुश्किल (और इसका समाधान)
\n\nकल्पना करें: आपने डेटाबेस से यूज़र्स की एक लिस्ट निकाली। हर यूज़र का नाम, उम्र, शहर और रेटिंग है। डेटा एसोसिएटिव ऐरे के रूप में आया। और फिर बॉस कहता है: "उम्र के हिसाब से सॉर्ट करो, फिर रेटिंग के हिसाब से उल्टे क्रम में।" यह स्थिति जानी-पहचानी है? अगर आपने कभी PHP में कोड लिखा है, तो आपने ज़रूर इस समस्या का सामना किया होगा: sort an array of associative arrays by column value। Stack Overflow पर हज़ारों व्यूज़ वाला यह सवाल झूठ नहीं बोलता - यह कई डेवलपर्स के लिए एक वास्तविक बाधा है।
\n\nइस लेख में हम PHP में मल्टीडायमेंशनल ऐरे को सॉर्ट करने के सभी तरीकों पर चर्चा करेंगे। सरल usort से लेकर शक्तिशाली array_multisort तक। आप सीखेंगे कि एक फील्ड, कई फील्ड, अलग-अलग दिशाओं में कैसे सॉर्ट करें और डेटा टाइप की गलतियों से कैसे बचें। चलिए शुरू करते हैं!
समस्या: सामान्य sort() क्यों काम नहीं करता
\n\nमान लीजिए, हमारे पास यह ऐरे है:
\n\n<?php\n$users = [\n ['name' => 'अन्ना', 'age' => 25, 'rating' => 4.7],\n ['name' => 'इवान', 'age' => 30, 'rating' => 3.9],\n ['name' => 'मारिया', 'age' => 22, 'rating' => 4.9],\n];\n?>\n\nअगर आप sort($users) करने की कोशिश करेंगे, तो PHP एक चेतावनी देगा और ऐरे को वैसे ही छोड़ देगा। क्यों? क्योंकि sort() सीधे एलिमेंट्स की तुलना करता है, और PHP को नहीं पता कि एसोसिएटिव ऐरे की तुलना कैसे करनी है। उसे एक संकेत चाहिए - कि किस फील्ड को सॉर्टिंग का मापदंड माना जाए।
तरीका #1: usort() - कस्टम सॉर्टिंग का राजा
\n\nफंक्शन usort() एक ऐरे और एक callback-फंक्शन लेता है जो दो एलिमेंट्स की तुलना करता है। यह सबसे लचीला और सबसे अधिक इस्तेमाल किया जाने वाला तरीका है।
एक फील्ड के अनुसार सॉर्ट करना (आरोही क्रम)
\n\n<?php\nusort($users, function($a, $b) {\n return $a['age'] <=> $b['age'];\n});\n// परिणाम: मारिया (22), अन्ना (25), इवान (30)\n?>\n\nऑपरेटर <=> (स्पेसशिप) PHP 7 में आया और कोड को साफ बनाता है। यह तुलना के आधार पर -1, 0 या 1 लौटाता है। अगर आपको अवरोही क्रम में चाहिए, तो बस $a और $b को बदल दें:
<?php\nusort($users, function($a, $b) {\n return $b['age'] <=> $a['age'];\n});\n// परिणाम: इवान (30), अन्ना (25), मारिया (22)\n?>\n\nस्ट्रिंग फील्ड के अनुसार सॉर्ट करना
\n\nस्ट्रिंग के साथ भी यही काम करता है, लेकिन लोकेल का ध्यान रखना ज़रूरी है। अगर आप हिंदी नामों को सॉर्ट कर रहे हैं, तो सही प्रोसेसिंग के लिए setlocale() और strcoll() का उपयोग करें:
<?php\nsetlocale(LC_ALL, 'hi_IN.UTF-8');\nusort($users, function($a, $b) {\n return strcoll($a['name'], $b['name']);\n});\n?>\n\nतरीका #2: array_multisort() - कई कॉलम के अनुसार सॉर्ट करने के लिए
\n\nजब पहले एक फील्ड और फिर दूसरे फील्ड के अनुसार सॉर्ट करना हो (जैसे, पहले शहर, फिर शहर के अंदर उम्र), तो usort में जटिल लॉजिक की ज़रूरत होती है। यहाँ array_multisort() काम आता है।
दो फील्ड के अनुसार सॉर्ट करना
\n\n<?php\n$ages = array_column($users, 'age');\n$ratings = array_column($users, 'rating');\narray_multisort($ages, SORT_ASC, $ratings, SORT_DESC, $users);\n?>\n\nजादू को समझते हैं: हम ज़रूरी कॉलम से अलग-अलग ऐरे बनाते हैं, फिर उन्हें array_multisort में पास करते हैं। महत्वपूर्ण: मूल ऐरे को सबसे अंत में पास किया जाता है - यह पहले ऐरे के क्रम के अनुसार पुनः सॉर्ट किया जाएगा। यह एक शक्तिशाली लेकिन खतरनाक उपकरण है: अगर कॉलम की लंबाई अलग-अलग है, तो आपको एरर मिलेगी।
तरीका #3: array_column() + sort() - एक-लाइनर के लिए हैक
\n\nअगर आपको सिर्फ एक न्यूमेरिक फील्ड के अनुसार ऐरे को सॉर्ट करना है, तो आप array_column() और array_multisort() के कॉम्बिनेशन का उपयोग एक लाइन में कर सकते हैं:
<?php\narray_multisort(array_column($users, 'age'), SORT_ASC, $users);\n?>