मूल एक आयामी सरणियाँ
$array = array(3, 5, 2, 8);
लागू प्रकार कार्य:
sort
rsort
asort
arsort
natsort
natcasesort
ksort
krsort
उन लोगों के बीच का अंतर केवल यह है कि क्या कुंजी-मूल्य संघों को रखा जाता है (" a" फ़ंक्शन), चाहे वह निम्न-से-उच्च या रिवर्स (" r") की तरह हो, चाहे वह मान या कुंजियाँ सॉर्ट करता हो (" k") और यह मूल्यों की तुलना कैसे करता है (" nat" बनाम सामान्य)। एक अवलोकन के लिए http://php.net/manual/en/array.sorting.php देखें और अधिक जानकारी के लिए लिंक।
वस्तुओं के सरणियों सहित बहु आयामी सरणियाँ
$array = array(
array('foo' => 'bar', 'baz' => 42),
array('foo' => ..., 'baz' => ...),
...
);
यदि आप $arrayप्रत्येक प्रविष्टि की कुंजी 'फू' के आधार पर छांटना चाहते हैं, तो आपको एक कस्टम तुलना फ़ंक्शन की आवश्यकता है । उपरोक्त sortऔर संबंधित कार्य सरल मूल्यों पर काम करते हैं जो उन्हें पता है कि कैसे तुलना और छाँटना है। पीएचपी बस नहीं "पता" करता है एक साथ क्या करना जटिल मूल्य की तरह array('foo' => 'bar', 'baz' => 42)हालांकि, तो आपको यह बताने की जरूरत है।
ऐसा करने के लिए, आपको एक तुलना फ़ंक्शन बनाने की आवश्यकता है । यह फ़ंक्शन दो तत्वों को लेता है और 0यदि इन तत्वों को समान माना जाता है तो वापस लौटना चाहिए , 0यदि पहला मान कम है और पहले मान से अधिक है तो मान से कम 0है। बस इतना ही चाहिए:
function cmp(array $a, array $b) {
if ($a['foo'] < $b['foo']) {
return -1;
} else if ($a['foo'] > $b['foo']) {
return 1;
} else {
return 0;
}
}
अक्सर, आप कॉलबैक के रूप में एक अनाम फ़ंक्शन का उपयोग करना चाहेंगे । यदि आप किसी विधि या स्थिर विधि का उपयोग करना चाहते हैं, तो PHP में कॉलबैक को निर्दिष्ट करने के अन्य तरीके देखें ।
आप तब इन कार्यों में से एक का उपयोग करते हैं:
फिर, वे केवल इस बात में भिन्न होते हैं कि क्या वे मूल्य-मूल्य संघों को रखते हैं और मूल्यों या कुंजियों द्वारा क्रमबद्ध करते हैं। विवरण के लिए उनके प्रलेखन पढ़ें।
उदाहरण का उपयोग:
usort($array, 'cmp');
usortसरणी से दो आइटम लेंगे और cmpउनके साथ अपने फ़ंक्शन को कॉल करेंगे। तो cmp()साथ बुलाया जाएगा $aके रूप में array('foo' => 'bar', 'baz' => 42)और $bएक अन्य के रूप में array('foo' => ..., 'baz' => ...)। यह फ़ंक्शन तब usortमानों में से एक पर वापस लौटता है जिसमें मान बड़ा था या वे समान थे। usortइस प्रक्रिया के लिए अलग-अलग मान पास करने को दोहराता है $aऔर $bजब तक सरणी सॉर्ट हो जाता है। cmpसमारोह में कई बार, बुलाया जाएगा कम से कम कई बार के रूप के रूप में वहाँ में मान रहे हैं $array, के लिए मूल्यों के विभिन्न संयोजनों के साथ $aऔर $bहर बार।
इस विचार के अभ्यस्त होने के लिए, यह प्रयास करें:
function cmp($a, $b) {
echo 'cmp called with $a:', PHP_EOL;
var_dump($a);
echo 'and $b:', PHP_EOL;
var_dump($b);
}
आपने जो भी किया वह दो वस्तुओं की तुलना करने के लिए एक कस्टम तरीका था, बस आपको इसकी आवश्यकता है। जो सभी प्रकार के मूल्यों के साथ काम करता है।
वैसे, यह किसी भी मूल्य पर काम करता है, मूल्यों को जटिल सरणियों होना जरूरी नहीं है। यदि आपके पास एक कस्टम तुलना है जिसे आप करना चाहते हैं, तो आप इसे साधारण संख्या में भी कर सकते हैं।
sort संदर्भ द्वारा सॉर्ट करें और उपयोगी कुछ भी वापस नहीं करता है!
ध्यान दें कि सरणी जगह में है , आपको कुछ भी रिटर्न मान निर्दिष्ट करने की आवश्यकता नहीं है। $array = sort($array)सरणी को प्रतिस्थापित trueनहीं करेगा , क्रमबद्ध सरणी के साथ नहीं। बस sort($array);काम करता है।
कस्टम संख्यात्मक तुलना
यदि आप bazकुंजी द्वारा क्रमबद्ध करना चाहते हैं , जो कि संख्यात्मक है, तो आपको बस इतना करना है:
function cmp(array $a, array $b) {
return $a['baz'] - $b['baz'];
}
के लिए धन्यवाद बिजली मठ के इस रिटर्न एक मूल्य <0, 0 या> 0 के आधार पर $aतुलना में कम है, करने के लिए या से बड़ा बराबर $b।
ध्यान दें कि यह floatमूल्यों के लिए अच्छी तरह से काम नहीं करेगा , क्योंकि वे कम हो जाएंगे intऔर सटीक खो देंगे। स्पष्ट का प्रयोग करें -1, 0और 1बजाय मान।
वस्तुओं
यदि आपके पास वस्तुओं का एक सरणी है, तो यह उसी तरह काम करता है:
function cmp($a, $b) {
return $a->baz - $b->baz;
}
कार्य
आप कॉलिंग फ़ंक्शन सहित एक तुलना फ़ंक्शन के अंदर कुछ भी कर सकते हैं:
function cmp(array $a, array $b) {
return someFunction($a['baz']) - someFunction($b['baz']);
}
स्ट्रिंग्स
पहले स्ट्रिंग तुलना संस्करण के लिए एक शॉर्टकट:
function cmp(array $a, array $b) {
return strcmp($a['foo'], $b['foo']);
}
strcmpवास्तव में cmpयहाँ क्या अपेक्षित है, यह रिटर्न करता है -1, 0या 1।
स्पेसशिप ऑपरेटर
PHP 7 ने स्पेसशिप ऑपरेटर की शुरुआत की , जो सभी प्रकार की तुलना में समान / छोटे / बड़े को एकीकृत और सरल करता है:
function cmp(array $a, array $b) {
return $a['foo'] <=> $b['foo'];
}
कई क्षेत्रों द्वारा छँटाई
यदि आप मुख्य रूप से क्रमबद्ध करना चाहते हैं foo, लेकिन यदि fooदो तत्वों के लिए बराबर है baz:
function cmp(array $a, array $b) {
if (($cmp = strcmp($a['foo'], $b['foo'])) !== 0) {
return $cmp;
} else {
return $a['baz'] - $b['baz'];
}
}
परिचित लोगों के लिए, यह SQL क्वेरी के साथ बराबर है ORDER BY foo, baz।
इसके अलावा यह बहुत साफ शॉर्टहैंड संस्करण देखें और इस तरह के तुलनात्मक फ़ंक्शन को गतिशील रूप से कुंजियों की संख्या के लिए कैसे बनाएं ।
एक मैनुअल, स्थिर क्रम में छंटनी
यदि आप "फू", "बार", "बाज" जैसे " मैनुअल ऑर्डर" में तत्वों को क्रमबद्ध करना चाहते हैं :
function cmp(array $a, array $b) {
static $order = array('foo', 'bar', 'baz');
return array_search($a['foo'], $order) - array_search($b['foo'], $order);
}
उपरोक्त सभी के लिए, यदि आप PHP 5.3 या उच्चतर का उपयोग कर रहे हैं (और आपको वास्तव में चाहिए), छोटे कोड के लिए अनाम फ़ंक्शंस का उपयोग करें और एक अन्य वैश्विक फ़ंक्शन के आसपास होने से बचने के लिए:
usort($array, function (array $a, array $b) { return $a['baz'] - $b['baz']; });
यह एक जटिल बहुआयामी सरणी को कितना सरल छाँट सकता है। फिर से, PHP को पढ़ाने के संदर्भ में सोचें कि कैसे बताएं कि दो में से कौन सी वस्तु "अधिक" है ; PHP को वास्तविक छँटाई करने दें।
उपरोक्त सभी के लिए, आरोही और अवरोही क्रम के बीच स्विच करने के लिए बस चारों ओर $aऔर $bतर्कों को स्वैप करें । उदाहरण के लिए:
return $a['baz'] - $b['baz']; // ascending
return $b['baz'] - $a['baz']; // descending
एक सरणी को दूसरे के आधार पर क्रमबद्ध करना
और फिर अजीबोगरीब है array_multisort, जो आपको दूसरे के आधार पर एक सरणी सॉर्ट करने देता है:
$array1 = array( 4, 6, 1);
$array2 = array('a', 'b', 'c');
यहाँ अपेक्षित परिणाम होगा:
$array2 = array('c', 'a', 'b'); // the sorted order of $array1
array_multisortवहां पहुंचने के लिए उपयोग करें :
array_multisort($array1, $array2);
PHP 5.5.0 के रूप में आप array_columnएक बहु आयामी सरणी से एक कॉलम निकालने और उस कॉलम पर सरणी को सॉर्ट करने के लिए उपयोग कर सकते हैं :
array_multisort(array_column($array, 'foo'), SORT_DESC, $array);
PHP 7.0.0 के रूप में आप ऑब्जेक्ट की एक सरणी से गुण भी निकाल सकते हैं।
यदि आपके पास अधिक सामान्य मामले हैं, तो इस उत्तर को संपादित करने के लिए स्वतंत्र महसूस करें।