PHP में ऑब्जेक्ट ऐरे को एक प्रॉपर्टी से सॉर्ट करना: पूरी गाइड

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

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

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

PHP में ऑब्जेक्ट ऐरे को सॉर्ट करना: शुरुआत से एक्सपर्ट तक

\n\n

एक स्थिति की कल्पना करें: आप PHP में एक ऑनलाइन स्टोर बना रहे हैं। आपके पास प्रोडक्ट्स की एक ऐरे है, और हर प्रोडक्ट एक ऑब्जेक्ट है जिसमें price, name, rating जैसे फील्ड हैं। यूज़र "कीमत के अनुसार सॉर्ट करें" पर क्लिक करता है, और आपको तुरंत इस ऐरे को रीअरेंज करना होता है। इसे सही और आसान तरीके से कैसे करें? यही आज के हमारे ट्यूटोरियल का विषय है।

\n\n

PHP में ऑब्जेक्ट ऐरे को एक प्रॉपर्टी से सॉर्ट करना Stack Overflow पर सबसे लोकप्रिय सवालों में से एक है (लाखों व्यूज़!)। और इसमें कोई आश्चर्य नहीं: ऑब्जेक्ट के साथ काम करना आधुनिक PHP की नींव है, और डेटा को लचीले ढंग से सॉर्ट करना एक ज़रूरी स्किल है। आइए सरल से जटिल तक, लाइव उदाहरणों और स्पष्टीकरणों के साथ सब कुछ समझते हैं।

\n\n

सीधे sort() का उपयोग क्यों नहीं कर सकते?

\n\n

शुरुआती अक्सर ऑब्जेक्ट ऐरे पर sort() या rsort() लगाने की कोशिश करते हैं। और उन्हें एरर या बेमतलब का रिजल्ट मिलता है। क्यों? क्योंकि ये फंक्शन एलिमेंट्स की तुलना सामान्य वैल्यू (नंबर या स्ट्रिंग) के रूप में करते हैं, जबकि ऑब्जेक्ट एक जटिल संरचना है। PHP को नहीं पता होता कि आप किस फील्ड के आधार पर सॉर्ट करना चाहते हैं: नाम, कीमत या तारीख। आपको स्पष्ट रूप से तुलना का नियम बताना होगा।

\n\n

इसी के लिए usort(), uasort() और uksort() फंक्शन मौजूद हैं। नाम में 'u' का मतलब 'user-defined' है - यूज़र द्वारा परिभाषित तुलना फंक्शन। हम खुद लिखते हैं कि दो ऑब्जेक्ट्स की तुलना कैसे करनी है।

\n\n

बेसिक उदाहरण: यूज़र्स को उम्र के अनुसार सॉर्ट करना

\n\n

मान लीजिए हमारे पास User क्लास और यूज़र्स की एक ऐरे है:

\n\n
class User {\n    public $name;\n    public $age;\n    \n    public function __construct($name, $age) {\n        $this->name = $name;\n        $this->age = $age;\n    }\n}\n\n$users = [\n    new User('अन्ना', 25),\n    new User('इवान', 30),\n    new User('ओल्गा', 22),\n    new User('पीटर', 28)\n];
\n\n

हमें उन्हें उम्र के बढ़ते क्रम में सॉर्ट करना है। usort का उपयोग करें:

\n\n
usort($users, function($a, $b) {\n    return $a->age <=> $b->age;\n});\n\n// परिणाम:\n// ओल्गा (22), अन्ना (25), पीटर (28), इवान (30)
\n\n

Spaceship operator ( <=> ) पर ध्यान दें - यह PHP 7.0 में आया और कोड को बेहद संक्षिप्त बनाता है। यह -1, 0 या 1 रिटर्न करता है, जो तुलना फंक्शन के लिए एकदम सही है।

\n\n

usort के काम करने का तरीका समझें

\n\n

usort() फंक्शन दो आर्गुमेंट लेता है:

\n
    \n
  • ऐरे (रेफरेंस द्वारा पास होता है - मूल ऐरे बदल जाएगा)
  • \n
  • Callback फंक्शन, जो दो एलिमेंट्स की तुलना करता है
  • \n
\n\n

Callback को रिटर्न करना चाहिए:

\n
    \n
  • नेगेटिव नंबर (आमतौर पर -1) - अगर पहला एलिमेंट दूसरे से छोटा है
  • \n
  • 0 - अगर दोनों एलिमेंट बराबर हैं
  • \n
  • पॉज़िटिव नंबर (आमतौर पर 1) - अगर पहला एलिमेंट दूसरे से बड़ा है
  • \n
\n\n

Spaceship operator यह सब अपने आप करता है। बिना इसके वही सॉर्टिंग कुछ इस तरह दिखती है:

\n\n
usort($users, function($a, $b) {\n    if ($a->age == $b->age) return 0;\n    return ($a->age < $b->age) ? -1 : 1;\n});
\n\n

फर्क साफ है: <=> ऑपरेटर 4 लाइनों को एक में बदल देता है। जहाँ भी PHP 7+ सपोर्ट हो, इसका उपयोग करें।

\n\n

स्ट्रिंग्स के अनुसार सॉर्टिंग: केस और लोकेल का ध्यान रखें

\n\n

नंबरों के साथ तो आसान है, लेकिन स्ट्रिंग्स में सावधानी चाहिए। आइए उन्हीं यूज़र्स को नाम के अनुसार सॉर्ट करें:

\n\n
usort($users, function($a, $b) {\n    return strcmp($a->name, $b->name);\n});\n\n// या spaceship के साथ:\nusort($users, function($a, $b) {\n    return $a->name <=> $b->name;\n});
\n\n

लेकिन एक बात है: spaceship केस को ध्यान में रखता है। स्ट्रिंग "apple" "Banana" से छोटी मानी जाएगी, क्योंकि 'a' का कोड (97) 'B' (66) से बड़ा है। केस-इनसेंसिटिव सॉर्टिंग के लिए आपको अलग तरीका अपनाना होगा।

ब्लॉग

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