2009-05-08 12 views
45

मैंने एक एनाग्राम मशीन बनाई और मेरे पास सकारात्मक मिलान की एक श्रृंखला है। समस्या यह है कि वे सभी एक अलग क्रम में हैं, मैं सरणी को सॉर्ट करने में सक्षम होना चाहता हूं ताकि सबसे लंबा सरणी मान पहले दिखाई दे।PHP: अपने मानों की लंबाई से सरणी को सॉर्ट करें?

किसी के पास यह कैसे करना है इस पर कोई विचार है?

उत्तर

124

उपयोग http://us2.php.net/manual/en/function.usort.php

इस कस्टम समारोह

function sort($a,$b){ 
    return strlen($b)-strlen($a); 
} 

usort($array,'sort'); 

उपयोग uasort आप पुराने अनुक्रमित रखने usort उपयोग करें यदि आप कोई परवाह नहीं है करना चाहते हैं के साथ।

इसके अलावा, मेरा मानना ​​है कि मेरा संस्करण बेहतर है क्योंकि यूजर एक अस्थिर प्रकार है।

$array = array("bbbbb", "dog", "cat", "aaa", "aaaa"); 
// mine 
[0] => bbbbb 
[1] => aaaa 
[2] => aaa 
[3] => cat 
[4] => dog 

// others 
[0] => bbbbb 
[1] => aaaa 
[2] => dog 
[3] => aaa 
[4] => cat 
+13

यह अच्छा है, हालांकि मैं फ़ंक्शन को 'सॉर्ट' नहीं कहूंगा। sortByLength नीचे अधिक वर्णनात्मक है। –

+5

सभी के लिए - mb_strlen() के बारे में याद रखें - सभी langs समान नहीं हैं – Jeffz

+0

कोई ब्रायन नहीं, फ़ंक्शन का काम सॉर्ट नहीं करना है, लेकिन तुलना करना है। इसलिए मैं इसे तुलना करता हूं StrLengthNegatively – fishbone

9
function sortByLength($a,$b){ 
    if($a == $b) return 0; 
    return (strlen($a) > strlen($b) ? -1 : 1); 
} 
usort($array,'sortByLength'); 
+1

इसमें एक बग है। आपकी समानता स्थिति बहुत संकीर्ण है। स्ट्रिंग्स "एबीसी" और "डीफ़" को इस तरह से 0 वापस करना चाहिए, लेकिन नहीं होगा। वे बदले में वापस आ जाएंगे। और जब मुझे एहसास हुआ कि यह एक गंभीर त्रुटि नहीं है (आउटपुट * टूटा * नहीं होगा, यह तकनीकी रूप से गलत है। –

+1

'अगर ($ a == $ b) 0 लौटाएं;' यह है एक गलती। हम लंबाई के बारे में बात कर रहे हैं। – Thinker

+0

@ पीटर और थिंकर, हाँ यह PHP मैनुअल की एक विषमता है। मैंने खुद को स्ट्रेलन ($ ए) == स्ट्रेलन ($ बी) किया, लेकिन फिर मैंने देखा कि PHP एक अस्थिर का उपयोग करता है सॉर्ट करें, इससे कोई फर्क नहीं पड़ता! यह अभी भी ऑर्डर को गड़बड़ कर देता है। इसलिए मैं सबसे कम काम करता हूं जो काम करता है। – Unknown

-1

यहां एक तरीका है जिसे मैंने अतीत में किया है।

// Here's the sorting... 
$array = array_combine($words, array_map('strlen', $words)); 
arsort($array); 
+0

सरणी समान मान के साथ संयुक्त हो जाएगी: सरणी (" अबा "," एए "," विज्ञापन "," वीसीडी "," अबा "); –

-5

यह आसान है।

function LSort(a,b){return a.length-b.length;} 

var YourArray=[[1,2,3,4,5,6], ['a','b'], ['X','Y','Z'], ['I','Love','You'], ['good man']]; 

YourArray.sort(Lsort); 

परिणाम:

['good man'] Length=1 
['a','b'] Length=3 
['X','Y','Z'] Length=3 
['I','Love','You'] Length=3 
[1,2,3,4,5,6] Length=6 
+11

PHP! = जावास्क्रिप्ट। –

+2

कृपया अपने स्वरूपण कौशल को बेहतर बनाने के लिए [यह मार्कडाउन सहायता पृष्ठ] (http://stackoverflow.com/editing-help) पर एक नज़र डालें। – Gumbo

49

आप इसे पीएचपी 5.3 तरीके से करना चाहते हैं, तो आप कुछ इस तरह बना सकते हैं:

usort($array, function($a, $b) { 
    return strlen($b) - strlen($a); 
}); 

इस तरह आप जीता ' अपने वैश्विक नामस्थान को प्रदूषित नहीं करें।

लेकिन यह केवल तभी करें जब आपको चीजों को शुष्क रखने के लिए अपने स्रोत कोड में एक ही स्थान पर इसकी आवश्यकता हो।

1

oyur सरणी तत्वों के strlen की एक सरणी बनाएं, और multisort इसे अपने सरणी के साथ बनाएं।

foreach($Yourarray as $c=>$key) {    
    $key['maxlen'] = strlen($key); 
    $sort_numcie[] = $key['maxlen']; 
} 

array_multisort($sort_numcie, $Yourarray); 

यह निश्चित रूप से काम करेगा। मुझे यकीन है!

function strlen_compare($a,$b){ 
    if(function_exists('mb_strlen')){ 
     return mb_strlen($b) - mb_strlen($a); 
    } 
    else{ 
     return strlen($b) - strlen($a); 
    } 
} 

function strlen_array_sort($array,$order='dsc'){ 
    usort($array,'strlen_compare'); 
    if($order=='asc'){ 
     $array=array_reverse($array); 
    } 
    return $array; 
} 
0

स्वीकार किए जाते हैं जवाब के अलावा, बढ़ते या घटते क्रम साथ लंबाई से एक सरणी सॉर्ट करने के लिए। PHP7 में, आप Spaceship Operator का उपयोग कर सकते हैं।

usort($array, function($a, $b) { 
    return strlen($b) <=> strlen($a); 
}); 

आशा है कि यह भविष्य में आपकी मदद कर सकता है।

संबंधित मुद्दे