PHP में 2D ऐरे को कॉलम के आधार पर सॉर्ट करना: "हुड के नीचे" का विश्लेषण

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

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

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

सॉर्टिंग का जादू: PHP द्वि-आयामी ऐरे को कैसे क्रमबद्ध करता है

\n\n

कल्पना करें: आपके पास डेटा वाली एक तालिका है — उपयोगकर्ताओं, उत्पादों या ऑर्डरों की सूची। आपको इसे उम्र, कीमत या तारीख के अनुसार सॉर्ट करना है। Excel में यह एक क्लिक से हो जाता है। और PHP में? यहाँ से सबसे दिलचस्प शुरुआत होती है। Stack Overflow पर प्रश्न "Sort a 2d array by a column value" ने हज़ारों बार देखा गया है, यह उन कार्यों में से एक है जो हर डेवलपर के सामने आता है।

\n\n

आज हम सिर्फ तैयार कोड नहीं देंगे। हम PHP के "हुड के नीचे" झाँकेंगे और समझेंगे कि मल्टीडायमेंशनल ऐरे सॉर्टिंग के तंत्र वास्तव में कैसे काम करते हैं। आप जानेंगे कि usort लूप से तेज़ क्यों है, PHP तत्वों की तुलना कैसे करता है, और शुरुआती लोगों के लिए कौन से नुकसान हैं। चलिए शुरू करते हैं!

\n\n

समस्या: 2D ऐरे को सॉर्ट करना इतना आसान क्यों नहीं है?

\n\n

PHP में एक-आयामी ऐरे के लिए sort() और asort() हैं। लेकिन जब ऐरे द्वि-आयामी (ऐरे का ऐरे) हो जाता है, तो मानक फ़ंक्शन काम नहीं करते। क्यों? क्योंकि PHP नहीं जानता कि आप किस "कॉलम" (आंतरिक ऐरे की कुंजी) के आधार पर सॉर्ट करना चाहते हैं।

\n\n

यहाँ एक विशिष्ट उदाहरण है:

\n\n
<?php\n$users = [\n    ['name' => 'Анна', 'age' => 25],\n    ['name' => 'Иван', 'age' => 30],\n    ['name' => 'Мария', 'age' => 22]\n];\n// उम्र के अनुसार कैसे सॉर्ट करें?\n?>
\n\n

बस sort($users) कॉल करें? नहीं — PHP एक चेतावनी देगा और गलत काम करेगा। एक अधिक स्मार्ट दृष्टिकोण की आवश्यकता है।

\n\n

समाधान #1: कस्टम फ़ंक्शन के साथ क्लासिक usort

\n\n

सबसे लोकप्रिय तरीका usort() का उपयोग करना है। यह फ़ंक्शन एक ऐरे और एक callback-फ़ंक्शन लेता है, जो सॉर्टिंग क्रम निर्धारित करता है। आइए इसे "हुड के नीचे" समझें।

\n\n

usort कैसे काम करता है?

\n\n

जब आप usort($array, $callback) कॉल करते हैं, तो PHP निम्न कार्य करता है:

\n
    \n
  • ऐरे को तत्वों के जोड़े में विभाजित करता है।
  • \n
  • प्रत्येक जोड़े के लिए आपका callback-फ़ंक्शन कॉल करता है।
  • \n
  • Callback को वापस करना चाहिए: ऋणात्मक संख्या (यदि पहला तत्व "छोटा" है), शून्य (यदि बराबर हैं), धनात्मक संख्या (यदि पहला "बड़ा" है)।
  • \n
  • इन उत्तरों के आधार पर, PHP तत्वों को पुनर्व्यवस्थित करता है, क्विकसॉर्ट (Quicksort) एल्गोरिदम या इसके हाइब्रिड का उपयोग करके।
  • \n
\n\n

कोड में यह इस प्रकार दिखता है:

\n\n
<?php\n$users = [\n    ['name' => 'Анна', 'age' => 25],\n    ['name' => 'Иван', 'age' => 30],\n    ['name' => 'Мария', 'age' => 22]\n];\n\nusort($users, function($a, $b) {\n    return $a['age'] - $b['age'];\n});\n\nprint_r($users);\n// परिणाम: Мария (22), Анна (25), Иван (30)\n?>
\n\n

ध्यान दें: हम $b की उम्र को $a से घटा रहे हैं। यदि $a['age'] छोटा है — परिणाम ऋणात्मक है, तत्व $a पहले आता है। बहुत सरल।

\n\n

नुकसान: स्ट्रिंग और केस सेंसिटिविटी

\n\n

यदि आप स्ट्रिंग फ़ील्ड (जैसे, नाम) के अनुसार सॉर्ट कर रहे हैं, तो घटाव काम नहीं करेगा। केस-इनसेंसिटिव सॉर्टिंग के लिए strcmp() या strcasecmp() का उपयोग करें:

\n\n
<?php\nusort($users, function($a, $b) {\n    return strcmp($a['name'], $b['name']);\n});\n// नाम के अनुसार सॉर्ट (Анна, Иван, Мария)\n?>
\n\n

लेकिन सावधान रहें: strcmp() केस-सेंसिटिव है। "apple" और "Apple" को अलग माना जाएगा। यदि यह महत्वपूर्ण है — strcasecmp() का उपयोग करें।

\n\n

समाधान #2: array_multisort — शक्तिशाली, लेकिन पेचीदा

\n\n

दूसरा लोकप्रिय तरीका array_multisort() है। यह फ़ंक्शन एक साथ कई ऐरे या एक कॉलम के आधार पर मल्टीडायमेंशनल ऐरे को सॉर्ट कर सकता है। "हुड के नीचे" यह अलग तरह से काम करता है: यह कॉलम निकालता है, उसे सॉर्ट करता है, और फिर शेष ऐरे को उसी क्रम में पुनर्व्यवस्थित करता है।

\n\n

यह इस प्रकार दिखता है:

\n\n
<?php\n$users = [\n    ['name' =&g                

ब्लॉग

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