PHP में ऑब्जेक्ट्स की ऐरे को सॉर्ट करना: 5 मिनट में अव्यवस्था से व्यवस्था तक
\n\nकल्पना करें: आप PHP में एक शैक्षिक वेबसाइट लिख रहे हैं और आपको डेटाबेस से छात्रों की एक सूची मिली है। प्रत्येक छात्र नाम, आयु और अंकों वाला एक ऑब्जेक्ट है। आपको उन्हें पेज पर प्रदर्शित करना है: पहले सबसे बड़े, या इसके विपरीत, सबसे छोटे। या हो सकता है, वर्णमाला क्रम में सॉर्ट करना हो। यह कैसे करें, यदि आपके पास संख्याओं की सरल ऐरे नहीं, बल्कि ऑब्जेक्ट्स की ऐरे है?
\n\nयह प्रश्न Stack Overflow पर सबसे लोकप्रिय प्रश्नों में से एक है। हजारों डेवलपर्स, शुरुआती से लेकर पेशेवरों तक, “sort array of objects by one property” कार्य का सामना करते हैं। और आज हम इसे हमेशा के लिए समझ लेंगे। बिना अनावश्यक बातों के, वास्तविक उदाहरणों और स्पष्ट स्पष्टीकरणों के साथ।
\n\nसामान्य sort() काम क्यों नहीं करती?
\n\nमान लीजिए, हमारे पास ऑब्जेक्ट्स की एक ऐरे $students है:
<?php\nclass Student {\n public $name;\n public $age;\n public $score;\n\n public function __construct($name, $age, $score) {\n $this->name = $name;\n $this->age = $age;\n $this->score = $score;\n }\n}\n\n$students = [\n new Student("अन्ना", 22, 85),\n new Student("इवान", 20, 92),\n new Student("मारिया", 23, 78),\n new Student("पीटर", 21, 95)\n];\n?>\n\nयदि आप sort($students) कॉल करने का प्रयास करते हैं, तो PHP एक त्रुटि देगा या कुछ नहीं करेगा। क्यों? क्योंकि sort() संख्याओं और स्ट्रिंग्स की तुलना कर सकता है, लेकिन यह नहीं जानता कि दो ऑब्जेक्ट्स की तुलना कैसे करें। इसे समझाने की आवश्यकता है: “age गुण के अनुसार तुलना करें” या “name के अनुसार तुलना करें”। इसके लिए PHP में एक विशेष फ़ंक्शन है — usort()।
परिचय: usort() — आपका मुख्य उपकरण
\n\nफ़ंक्शन usort() दो तर्क लेता है: स्वयं ऐरे और एक तुलना फ़ंक्शन। इस तुलना फ़ंक्शन को वापस करना चाहिए:
- \n
- 0, यदि तत्व बराबर हैं; \n
- ऋणात्मक संख्या, यदि पहला तत्व दूसरे से छोटा है; \n
- धनात्मक संख्या, यदि पहला तत्व दूसरे से बड़ा है। \n
जटिल लगता है? वास्तव में यह सरल है। आइए छात्रों को आयु के अनुसार (आरोही क्रम में) सॉर्ट करें:
\n\n<?php\nusort($students, function($a, $b) {\n return $a->age <=> $b->age;\n});\n\n// परिणाम: इवान (20), पीटर (21), अन्ना (22), मारिया (23)\n?>\n\nऑपरेटर <=> (स्पेसशिप) पर ध्यान दें। यह PHP 7 में दिखाई दिया और सॉर्टिंग को अत्यंत संक्षिप्त बनाता है। यह दो मानों की तुलना करता है और -1, 0 या 1 लौटाता है। बिल्कुल वही जो usort() को चाहिए।
अवरोही क्रम में सॉर्ट करना: चिह्न बदलना
\n\nबड़े से छोटे की ओर सॉर्ट करना चाहते हैं? बस ऑपरेटर <=> में ऑपरेंड को बदल दें:
\n\n<?php\nusort($students, function($a, $b) {\n return $b->age <=> $a->age; // अब b की तुलना a से की जाती है\n});\n\n// परिणाम: मारिया (23), अन्ना (22), पीटर (21), इवान (20)\n?>\n\nया, समान रूप से, परिणाम को -1 से गुणा करें:
\n\n<?php\nusort($students, function($a, $b) {\n return -($a->age <=> $b->age);\n});\n?>\n\nस्ट्रिंग्स (वर्णमाला) के अनुसार सॉर्ट करना
\n\nऔर यदि गुण एक स्ट्रिंग है? उदाहरण के लिए, नाम। वही सिद्धांत, लेकिन <=> के बजाय strcmp() या strcasecmp() (केस-असंवेदनशील तुलना के लिए) का उपयोग करें:
<?php\n// वर्णमाला क्रम में (अ-ह)\nusort($students, function($a, $b) {\n return strcmp($a->name, $b->name);\n});\n\n// परिणाम: अन्ना, इवान, मारिया, पीटर\n\n// वर्णमाला क्रम में (ह-अ) — उल्टा क्रम\nusort($students, function($a, $b) {\n return strcmp($b->name, $a->name);\n});\n?>\n\nसंख्यात्मक गुण के अनुसार सॉर्ट करना: <=> का विकल्प
\n\nऑपरेटर <=> सुविधाजनक है, लेकिन यदि आप पुराने PHP (7.0 से पहले) के साथ काम कर रहे हैं, तो यह मौजूद नहीं है। तब तुलना मैन्युअल रूप से लिखें: