मूल एक आयामी सरणियाँ
$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 के रूप में आप ऑब्जेक्ट की एक सरणी से गुण भी निकाल सकते हैं।
यदि आपके पास अधिक सामान्य मामले हैं, तो इस उत्तर को संपादित करने के लिए स्वतंत्र महसूस करें।