PHP में कॉलम मान के अनुसार ऐरे को सॉर्ट करना: उन लोगों के लिए गाइड जो गूगल करते-करते थक गए हैं
\n\nक्या आप कभी ऐसी स्थिति में आए हैं जहाँ आपके पास उपयोगकर्ताओं, उत्पादों या ऑर्डरों की सूची एसोसिएटिव ऐरे के ऐरे के रूप में हो, और आपको उन्हें किसी फील्ड के अनुसार सॉर्ट करने की आवश्यकता हो? मान लीजिए, उम्र, कीमत या पंजीकरण तिथि के अनुसार। यदि हाँ — तो आप अकेले नहीं हैं। Stack Overflow पर इस प्रश्न ने हज़ारों व्यूज़ और दर्जनों वोट एकत्र किए हैं। और आज हम इसे हमेशा के लिए समझ लेंगे।
\n\nइस लेख में, हम केवल यह नहीं दिखाएंगे कि usort और array_multisort कैसे काम करते हैं। हम उन सबसे सामान्य प्रश्नों का उत्तर देंगे जो डेवलपर्स के मन में आते हैं: नेस्टेड की के अनुसार कैसे सॉर्ट करें, कीज़ को कैसे संरक्षित करें, कई फील्ड के अनुसार कैसे सॉर्ट करें, और यदि डेटा डेटाबेस से आता है तो क्या करें।
चलिए शुरू करते हैं!
\n\nएसोसिएटिव ऐरे का ऐरे क्या है और इसे क्यों सॉर्ट करें?
\n\nकल्पना करें कि आपके पास उपयोगकर्ताओं की एक सूची है:
\n\n$users = [\n ['name' => 'अन्ना', 'age' => 25, 'city' => 'मॉस्को'],\n ['name' => 'बोरिस', 'age' => 30, 'city' => 'सेंट पीटर्सबर्ग'],\n ['name' => 'विक्टर', 'age' => 22, 'city' => 'कज़ान'],\n];\n\nयह PHP में एक विशिष्ट मल्टीडायमेंशनल ऐरे है, जहाँ प्रत्येक तत्व समान कीज़ वाला एक एसोसिएटिव ऐरे है। अक्सर ऐसी सूची को किसी फील्ड के अनुसार सॉर्ट करके प्रदर्शित करने की आवश्यकता होती है: उम्र के अनुसार (सबसे छोटे से सबसे बड़े), नाम के अनुसार (वर्णमाला क्रम में) या शहर के अनुसार।
\n\nPHP के मानक फ़ंक्शन जैसे sort() या asort() यहाँ मदद नहीं करेंगे — वे सरल मानों के साथ काम करते हैं, नेस्टेड संरचनाओं के साथ नहीं। विशेष उपकरणों की आवश्यकता है।
सबसे लोकप्रिय तरीका: अनाम फ़ंक्शन के साथ usort
\n\nयदि आप Stack Overflow पर जाते हैं और "Sort an array of associative arrays by column value" चर्चा खोलते हैं, तो 90% मामलों में आपको usort की सलाह दी जाएगी। यह तार्किक है: usort फ़ंक्शन आपको ऐरे के दो तत्वों की तुलना करने के लिए अपना स्वयं का तर्क सेट करने की अनुमति देता है।
एक फील्ड (उम्र) के अनुसार ऐरे को कैसे सॉर्ट करें
\n\nमान लीजिए, हम अपने उपयोगकर्ताओं को उम्र के अनुसार आरोही क्रम में सॉर्ट करना चाहते हैं:
\n\n<?php\n$users = [\n ['name' => 'अन्ना', 'age' => 25, 'city' => 'मॉस्को'],\n ['name' => 'बोरिस', 'age' => 30, 'city' => 'सेंट पीटर्सबर्ग'],\n ['name' => 'विक्टर', 'age' => 22, 'city' => 'कज़ान'],\n];\n\nusort($users, function($a, $b) {\n return $a['age'] <=> $b['age'];\n});\n\nprint_r($users);\n?>\n\nपरिणाम:
\nArray\n(\n [0] => Array ( [name] => विक्टर [age] => 22 [city] => कज़ान )\n [1] => Array ( [name] => अन्ना [age] => 25 [city] => मॉस्को )\n [2] => Array ( [name] => बोरिस [age] => 30 [city] => सेंट पीटर्सबर्ग )\n)\n\nध्यान दें: हम स्पेसशिप ऑपरेटर <=> का उपयोग कर रहे हैं, जो PHP 7 में आया था। यह -1, 0 या 1 लौटाता है, जो सॉर्टिंग फ़ंक्शन के लिए एकदम सही है। यदि अवरोही क्रम में सॉर्ट करना है, तो बस $a और $b को बदल दें:
usort($users, function($a, $b) {\n return $b['age'] <=> $a['age'];\n});\n\nस्ट्रिंग फील्ड (नाम) के अनुसार सॉर्टिंग
\n\nस्ट्रिंग के लिए भी यह उतना ही सरल है। क्या आप उपयोगकर्ताओं को वर्णमाला क्रम में नाम के अनुसार सॉर्ट करना चाहते हैं? कृपया:
\n\nusort($users, function($a, $b) {\n return strcmp($a['name'], $b['name']);\n});\n\nया फिर से <=> का उपयोग करें — यह स्ट्रिंग के साथ भी काम करता है:
usort($users, function($a, $b) {\n return $a['name'] <=> $b['name'];\n});\n\nसामान्य प्रश्न और संभावित समस्याएँ
\n\n1. नेस्टेड की के अनुसार कैसे सॉर्ट करें?
\n\nकभी-कभी डेटा की गहरी संरचना होती है। उदाहरण के लिए, प्रत्येक उपयोगकर्ता के पास एक profile ऐरे होता है