PHP में कॉलम वैल्यू के आधार पर ऐरे सॉर्ट करना: पूरी गाइड

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

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

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

एसोसिएटिव ऐरे को सॉर्ट करना क्यों है मुश्किल (और इसका समाधान)

\n\n

कल्पना करें: आपने डेटाबेस से यूज़र्स की एक लिस्ट निकाली। हर यूज़र का नाम, उम्र, शहर और रेटिंग है। डेटा एसोसिएटिव ऐरे के रूप में आया। और फिर बॉस कहता है: "उम्र के हिसाब से सॉर्ट करो, फिर रेटिंग के हिसाब से उल्टे क्रम में।" यह स्थिति जानी-पहचानी है? अगर आपने कभी PHP में कोड लिखा है, तो आपने ज़रूर इस समस्या का सामना किया होगा: sort an array of associative arrays by column value। Stack Overflow पर हज़ारों व्यूज़ वाला यह सवाल झूठ नहीं बोलता - यह कई डेवलपर्स के लिए एक वास्तविक बाधा है।

\n\n

इस लेख में हम PHP में मल्टीडायमेंशनल ऐरे को सॉर्ट करने के सभी तरीकों पर चर्चा करेंगे। सरल usort से लेकर शक्तिशाली array_multisort तक। आप सीखेंगे कि एक फील्ड, कई फील्ड, अलग-अलग दिशाओं में कैसे सॉर्ट करें और डेटा टाइप की गलतियों से कैसे बचें। चलिए शुरू करते हैं!

\n\n

समस्या: सामान्य 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 को नहीं पता कि एसोसिएटिव ऐरे की तुलना कैसे करनी है। उसे एक संकेत चाहिए - कि किस फील्ड को सॉर्टिंग का मापदंड माना जाए।

\n\n

तरीका #1: usort() - कस्टम सॉर्टिंग का राजा

\n\n

फंक्शन usort() एक ऐरे और एक callback-फंक्शन लेता है जो दो एलिमेंट्स की तुलना करता है। यह सबसे लचीला और सबसे अधिक इस्तेमाल किया जाने वाला तरीका है।

\n\n

एक फील्ड के अनुसार सॉर्ट करना (आरोही क्रम)

\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 को बदल दें:

\n\n
<?php\nusort($users, function($a, $b) {\n    return $b['age'] <=> $a['age'];\n});\n// परिणाम: इवान (30), अन्ना (25), मारिया (22)\n?>
\n\n

स्ट्रिंग फील्ड के अनुसार सॉर्ट करना

\n\n

स्ट्रिंग के साथ भी यही काम करता है, लेकिन लोकेल का ध्यान रखना ज़रूरी है। अगर आप हिंदी नामों को सॉर्ट कर रहे हैं, तो सही प्रोसेसिंग के लिए setlocale() और strcoll() का उपयोग करें:

\n\n
<?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

दो फील्ड के अनुसार सॉर्ट करना

\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 में पास करते हैं। महत्वपूर्ण: मूल ऐरे को सबसे अंत में पास किया जाता है - यह पहले ऐरे के क्रम के अनुसार पुनः सॉर्ट किया जाएगा। यह एक शक्तिशाली लेकिन खतरनाक उपकरण है: अगर कॉलम की लंबाई अलग-अलग है, तो आपको एरर मिलेगी।

\n\n

तरीका #3: array_column() + sort() - एक-लाइनर के लिए हैक

\n\n

अगर आपको सिर्फ एक न्यूमेरिक फील्ड के अनुसार ऐरे को सॉर्ट करना है, तो आप array_column() और array_multisort() के कॉम्बिनेशन का उपयोग एक लाइन में कर सकते हैं:

\n\n
<?php\narray_multisort(array_column($users, 'age'), SORT_ASC, $users);\n?>

ब्लॉग

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