दिलचस्प पोस्ट

ऑब्जेक्ट फ़ील्ड के अनुसार ऑब्जेक्ट्स को व्यवस्थित करें

मैं इस श्रेणी के ऑब्जेक्ट को अपने किसी फ़ील्ड से कैसे name कर सकता हूँ, जैसे name या count ?

  Array ( [0] => stdClass Object ( [ID] => 1 [name] => Mary Jane [count] => 420 ) [1] => stdClass Object ( [ID] => 2 [name] => Johnny [count] => 234 ) [2] => stdClass Object ( [ID] => 3 [name] => Kathy [count] => 4354 ) .... 

वेब के समाधान से एकत्रित समाधान "ऑब्जेक्ट फ़ील्ड के अनुसार ऑब्जेक्ट्स को व्यवस्थित करें"

यूज़ोर्ट का उपयोग करें, यहां मैन्युअल से अनुकूलित किया गया एक उदाहरण है:

 function cmp($a, $b) { return strcmp($a->name, $b->name); } usort($your_data, "cmp"); 

टिप्पणियों से आयात किए गए संपादन:

यदि आप कक्षा के भीतर से सरणी cmp और आपकी छँटाई फ़ंक्शन cmp को कक्षा में भी परिभाषित किया गया है, तो इसका प्रयोग करें:

 usort($your_data, array($this, "cmp")) 

क्लोज़र का उपयोग करते हुए अच्छा तरीका है

 usort($your_data, function($a, $b) { return strcmp($a->name, $b->name); }); 

कृपया ध्यान दें कि यह PHP के प्रलेखन में नहीं है, लेकिन यदि आप 5.3 + क्लोजर का उपयोग कर रहे हैं, तो उसे समर्थन योग्य कहां उपलब्ध कराया जा सकता है।

यदि आप PHP ओओपी का उपयोग कर रहे हैं तो आपको इसमें परिवर्तन करने की आवश्यकता हो सकती है:

 public static function cmp($a, $b) { return strcmp($a->name, $b->name); } //in this case FUNCTION_NAME would be cmp usort($your_data, array('YOUR_CLASS_NAME','FUNCTION_NAME')); 
 usort($array, 'my_sort_function'); var_dump($array); function my_sort_function($a, $b) { return $a->name < $b->name; } 

एक ही कोड count क्षेत्र के साथ होगा।

usort बारे में अधिक जानकारी: http://ru2.php.net/usort

बीटीडब्ल्यू, आपने उस सरणी को कहाँ से लिया? मुझे उम्मीद है कि डेटाबेस से नहीं?

आप इस फ़ंक्शन का उपयोग कर सकते हैं (PHP संस्करण> = 5.3 में काम करता है):

 function sortArrayByKey(&$array,$key,$string = false,$asc = true){ if($string){ usort($array,function ($a, $b) use(&$key,&$asc) { if($asc) return strcmp(strtolower($a{$key}), strtolower($b{$key})); else return strcmp(strtolower($b{$key}), strtolower($a{$key})); }); }else{ usort($array,function ($a, $b) use(&$key,&$asc) { if($a[$key] == $b{$key}){return 0;} if($asc) return ($a{$key} < $b{$key}) ? -1 : 1; else return ($a{$key} > $b{$key}) ? -1 : 1; }); } } 

उदाहरण:

 sortArrayByKey($yourArray,"name",true); //String sort (ascending order) sortArrayByKey($yourArray,"name",true,false); //String sort (descending order) sortArrayByKey($yourArray,"id"); //number sort (ascending order) sortArrayByKey($yourArray,"count",false,false); //number sort (descending order) 

यदि आप पूर्णांक मान को सॉर्ट करना चाहते हैं:

 // Desc sort usort($array,function($first,$second){ return $first->number < $second->number; }); // Asc sort usort($array,function($first,$second){ return $first->number > $second->number; }); 

यदि आप इसे अंदर codeigniter का उपयोग कर रहे हैं, तो आप विधियों का उपयोग कर सकते हैं:

 usort($jobs, array($this->job_model, "sortJobs")); // function inside Model usort($jobs, array($this, "sortJobs")); // Written inside Controller. 

@ रमोनी आपको सुझाव के लिए धन्यवाद। यह वास्तव में मेरी मदद करता है

यदि आपको स्थानीय आधारित स्ट्रिंग तुलना की आवश्यकता है, तो आप strcoll बजाय strcoll उपयोग कर सकते हैं।

यदि आवश्यक हो तो लोकेल जानकारी सेट करने के लिए पहले LC_COLLATE साथ setlocale उपयोग करने के लिए याद रखें

  usort($your_data,function($a,$b){ setlocale (LC_COLLATE, 'pl_PL.UTF-8'); // Example of Polish language collation return strcoll($a->name,$b->name); }); 

सभी उत्तरों का नकारात्मक पक्ष यह है कि वे स्थिर फ़ील्ड नामों का उपयोग करते हैं, इसलिए मैंने ओओपी शैली में एक समायोजित संस्करण लिखा था माना जाता है कि आप ऐसे गेटर्स विधियों का उपयोग कर रहे हैं जो आप सीधे इस कक्षा का उपयोग कर सकते हैं और पैरामीटर के रूप में फ़ील्ड नाम का उपयोग कर सकते हैं। शायद किसी को इसे उपयोगी लगता है

 class CustomSort{ public $field = ''; public function cmp($a, $b) { /** * field for order is in a class variable $field * using getter function with naming convention getVariable() we set first letter to uppercase * we use variable variable names - $a->{'varName'} would directly access a field */ return strcmp($a->{'get'.ucfirst($this->field)}(), $b->{'get'.ucfirst($this->field)}()); } public function sortObjectArrayByField($array, $field) { $this->field = $field; usort($array, array("Your\Namespace\CustomSort", "cmp"));; return $array; } } 

आप usort उपयोग कर सकते हैं, जैसे:

 usort($array,function($first,$second){ return strcmp($first->name, $second->name); }); 

यदि सब कुछ यहां विफल रहता है तो एक और समाधान है:

 $names = array(); foreach ($my_array as $my_object) { $names[] = $my_object->name; //any object field } array_multisort($names, SORT_ASC, $my_array); return $my_array; 

यदि आपको केवल एक फ़ील्ड के आधार पर सॉर्ट करने की आवश्यकता है, तो usort एक अच्छा विकल्प है। हालांकि, यदि आपको एकाधिक फ़ील्ड्स द्वारा क्रमबद्ध करने की आवश्यकता होती है, तो समाधान जल्दी गन्दा हो जाता है इस स्थिति में, YaLinqo लाइब्रेरी * का उपयोग किया जा सकता है, जो सरणी और ऑब्जेक्ट्स के लिए एसक्यूएल-जैसी क्वेरी सिंटैक्स लागू करता है। इसमें सभी मामलों के लिए एक सुंदर सिंटैक्स है:

 $sortedByName = from($objects)->orderBy('$v->name'); $sortedByCount = from($objects)->orderBy('$v->count'); $sortedByCountAndName = from($objects)->orderBy('$v->count')->thenBy('$v->name'); 

यहां, '$v->count' function ($v) { return $v->count; } लिए एक लबादा function ($v) { return $v->count; } function ($v) { return $v->count; } (या तो इस्तेमाल किया जा सकता है)। ये पद्धति श्रृंखला रोटेटरों को वापस लौटती हैं, लेकिन आप अंतराल में ->toArray() जोड़कर सरणियों को प्राप्त कर सकते हैं यदि आपको इसकी आवश्यकता है।

* मेरे द्वारा विकसित

आप एनएसपीएल से सॉर्ट किए गए फ़ंक्शन का उपयोग कर सकते हैं:

 use function \nspl\a\sorted; use function \nspl\op\propertyGetter; use function \nspl\op\methodCaller; // Sort by property value $sortedByCount = sorted($objects, propertyGetter('count')); // Or sort by result of method call $sortedByName = sorted($objects, methodCaller('getName')); 

प्रेरणा के लिए धन्यवाद, मुझे एक बाहरी $ अनुवादक पैरामीटर जोड़ना पड़ा

 usort($listable_products, function($a, $b) { global $translator; return strcmp($a->getFullTitle($translator), $b->getFullTitle($translator)); });