PHP में किसी दिए गए कुंजी के मूल्य से साहचर्य सरणियों की एक सरणी को कैसे सॉर्ट करना है?


446

इस सरणी को देखते हुए:

$inventory = array(

   array("type"=>"fruit", "price"=>3.50),
   array("type"=>"milk", "price"=>2.90),
   array("type"=>"pork", "price"=>5.43),

);

मैं $inventoryपाने के लिए कीमत के आधार पर तत्वों को क्रमबद्ध करना चाहूंगा :

$inventory = array(

   array("type"=>"pork", "price"=>5.43),
   array("type"=>"fruit", "price"=>3.50),
   array("type"=>"milk", "price"=>2.90),

);

मैं यह कैसे कर सकता हूँ?


जवाबों:


606

आप सही हैं, जिस फ़ंक्शन को आप देख रहे हैं वह है array_multisort()

यहां एक उदाहरण सीधे मैनुअल से लिया गया है और आपके मामले के अनुकूल है:

$price = array();
foreach ($inventory as $key => $row)
{
    $price[$key] = $row['price'];
}
array_multisort($price, SORT_DESC, $inventory);

PHP 5.5.0 के रूप में आप उस फॉर्च्यूनर के बजाय array_column () का उपयोग कर सकते हैं

$price = array_column($inventory, 'price');

array_multisort($price, SORT_DESC, $inventory);

5
हालांकि यह निश्चित रूप से विकल्पों की तुलना में अधिक महंगा है।
मैट

5
अधिक महंगा? यह अजीब है, मेरी मशीन पर (PHP 5.3.1-dev चल रहा है) array_multisort () छोटी सरणियों पर कुछ प्रतिशत तेज है और बड़े सरणियों (100+ तत्वों) पर 100 गुना तेज है
जोश डेविस

3
इसे संख्यात्मक कुंजियों के साथ काम करने के लिए किसी भी बदलाव की आवश्यकता नहीं होनी चाहिए। यदि आप संख्यात्मक कुंजियों से संबंधित बग या अजीब व्यवहार को मार रहे हैं, तो इसे एक नए प्रश्न के रूप में पोस्ट करें।
जोश डेविस

4
array_multisort में एक बड़ी समस्या है: यह मूल कुंजी को बनाए नहीं रखता है।
मेकिनडाइक्ट

1
@machineaddict यह सहयोगी कुंजी बनाए रखता है।
19j पर Matej Svajger

318

PHP 7+

PHP 7 के रूप में, यह तत्वों की तुलना करने के लिए स्पेसशिप ऑपरेटर का उपयोग usortकरने वाले एक अनाम फ़ंक्शन का उपयोग करके संक्षिप्त रूप से किया जा सकता है ।

आप इस तरह एक आरोही प्रकार कर सकते हैं:

usort($inventory, function ($item1, $item2) {
    return $item1['price'] <=> $item2['price'];
});

या इस तरह एक अवरोही क्रम:

usort($inventory, function ($item1, $item2) {
    return $item2['price'] <=> $item1['price'];
});

यह समझने के लिए कि यह कैसे काम करता है, ध्यान दें कि usortउपयोगकर्ता द्वारा प्रदान किए गए तुलनात्मक फ़ंक्शन को निम्नानुसार व्यवहार करना चाहिए (डॉक्स से):

तुलनात्मक फ़ंक्शन को पूर्णांक को शून्य से अधिक या शून्य से अधिक वापस करना होगा यदि पहले तर्क को क्रमशः से कम, दूसरे के बराबर या उससे अधिक माना जाता है।

और यह भी ध्यान दें कि <=>, अंतरिक्ष यान ऑपरेटर,

रिटर्न 0 अगर दोनों ऑपरेंड बराबर हैं, 1 अगर लेफ्ट ज्यादा है, और -1 अगर राइट ज्यादा है

जो वास्तव में क्या usortजरूरत है वास्तव में, https://wiki.php.net/rfc/combined-comparison-operator<=> में भाषा को जोड़ने के लिए दिया गया लगभग पूरा औचित्य यह है कि

usort()आसान के साथ उपयोग के लिए लेखन आदेश कॉलबैक बनाता है


PHP 5.3+

PHP 5.3 ने अनाम फ़ंक्शंस पेश किए, लेकिन अभी तक स्पेसशिप ऑपरेटर नहीं है। हम usortअपने एरे को सॉर्ट करने के लिए अभी भी उपयोग कर सकते हैं , लेकिन यह थोड़ा और क्रिया है और समझने में कठिन है:

usort($inventory, function ($item1, $item2) {
    if ($item1['price'] == $item2['price']) return 0;
    return $item1['price'] < $item2['price'] ? -1 : 1;
});

ध्यान दें कि हालांकि पूर्णांक मानों से निपटने वाले तुलनित्रों के लिए यह काफी सामान्य है कि वे मूल्यों का अंतर लौटाएं, जैसे $item2['price'] - $item1['price'], हम इस मामले में सुरक्षित रूप से ऐसा नहीं कर सकते । ऐसा इसलिए है क्योंकि प्रश्न पूछने वाले के उदाहरण में कीमतें अस्थायी संख्या में हैं, लेकिन काम करने के usortलिए पूर्णांक को वापस करने के लिए हमारे पास होने वाले तुलनात्मक कार्य usort:

रिटर्निंग गैर पूर्णांक इस तरह नाव के रूप में तुलना समारोह से मूल्यों,, कॉलबैक द्वारा दिया गया मान के पूर्णांक के लिए एक आंतरिक कलाकारों का परिणाम देगा। तो 0.99 और 0.1 जैसे मान दोनों को 0 के पूर्णांक मान पर कास्ट किया जाएगा, जो इस तरह के मूल्यों की तुलना करेगा।

यह usortPHP 5.x में उपयोग करते समय ध्यान में रखने के लिए एक महत्वपूर्ण जाल है ! इस जवाब के मेरे मूल संस्करण ने यह गलती की और फिर भी मैंने हजारों बगलों में से दस अपवित्रों को अर्जित किया, जो बिना किसी गंभीर बग को देखे किसी को भी प्रकट नहीं हुए। कितनी आसानी से lackwits की तरह मुझे तुलनित्र कार्यों को पेंच कर सकते हैं ठीक कारण यह है कि आसान से उपयोग अंतरिक्ष यान ऑपरेटर पीएचपी 7 में भाषा को जोड़ा गया है।


8
क्षमा करें, लेकिन यह दृष्टिकोण सहयोगी सरणियों से स्ट्रिंग कुंजियों को हटा देता है। "uasort" फ़ंक्शन का उपयोग इसके बजाय किया जाना चाहिए।
मैटियो-सॉफ्टनेट

8
@ डोटमैट दिलचस्प - मुझे इसके बारे में पता नहीं था uasort। डॉक्स को देखने के बाद, हालांकि, इस मामले में यह उत्तर अभी भी सही है । ओपी के उदाहरण में, सॉर्ट किए जाने वाले सरणी में स्ट्रिंग इंडेक्स के बजाय अनुक्रमिक संख्यात्मक सूचकांक होते हैं, इसलिए usortयह अधिक उपयुक्त है। uasortक्रमिक रूप से अनुक्रमित सरणी का उपयोग करने पर एक सॉर्ट किए गए सरणी का परिणाम होगा, जो इसके संख्यात्मक अनुक्रमित द्वारा आदेशित नहीं है, जैसे कि foreachलूप में देखा गया पहला तत्व नहीं है $your_array[0], जो वांछनीय व्यवहार होने की संभावना नहीं है।
मार्क अमेरी

100

जबकि अन्य ने सही तरीके से उपयोग करने का सुझाव दिया है array_multisort(), किसी कारण से कोई जवाब नहीं लगता है जो अस्तित्व को स्वीकार करता है array_column(), जो समाधान को सरल बना सकता है। तो मेरा सुझाव होगा:

array_multisort(array_column($inventory, 'price'), SORT_DESC, $inventory);

1
किसी कारण से मैं इसे कम / ऊपरी अक्षरों वाले तार के साथ काम करने में सक्षम नहीं था। यहां तक ​​कि SORT_FLAG_CASE का उपयोग करते हुए। निम्नलिखित ने मेरे लिए स्ट्रिंग तुलना के लिए काम किया: array_multisort (array_map (strtolower, array_column ($ ipr_projects, 'Name')), SORT_ASC, $ ipr_projectject);
पाबामेटो

8
यह सबसे सुरुचिपूर्ण उत्तर है। बहुत अधिक दर्जा दिया जाना चाहिए!
Armin Hierstetter

3
सबसे छोटा और सबसे आसान, मेरी राय में एक को स्वीकार किया
StudioX

1
यहाँ अच्छा सामान। पूरी तरह से मेरे लिए काम किया!
फंक डॉक

एक आकर्षण की तरह काम किया, ty
Leif_Lundberg

42

चूंकि आपके सरणी तत्व स्ट्रिंग कुंजियों के साथ खुद को एरेस्ट कर रहे हैं, इसलिए आपका सबसे अच्छा शर्त एक कस्टम तुलना फ़ंक्शन को परिभाषित करना है। यह बहुत जल्दी और करने में आसान है। इसे इस्तेमाल करे:

function invenDescSort($item1,$item2)
{
    if ($item1['price'] == $item2['price']) return 0;
    return ($item1['price'] < $item2['price']) ? 1 : -1;
}
usort($inventory,'invenDescSort');
print_r($inventory);

निम्नलिखित का उत्पादन करता है:

Array
(
    [0] => Array
        (
            [type] => pork
            [price] => 5.43
        )

    [1] => Array
        (
            [type] => fruit
            [price] => 3.5
        )

    [2] => Array
        (
            [type] => milk
            [price] => 2.9
        )

)

4
यहाँ कुछ अन्य टिप्पणियों के साथ संयोजन (uasort और इनलाइन अनाम फ़ंक्शंस), आपको यह एक-लाइनर मिलता है:uasort( $inventory, function ($a, $b) { if ( $a==$b ) return 0; else return ($a > $b) ? -1 : 1; });
एलन पोर्टर

क्रमिक संख्यात्मक कुंजियों के साथ किसी सरणी को छांटने के लिए @AlanPorter usortअधिक उपयुक्त लगता है uasort। एक सरणी के साथ समाप्त होना जहां पहला तत्व सूचकांक में है 1और दूसरा तत्व सूचकांक 0में अजीब व्यवहार है और उन लोगों के लिए एक निश्चित जाल है जो PHP के सरणियों के विवरण से परिचित नहीं हैं; usortआपको वह आउटपुट देता है जिसकी आप अपेक्षा करते हैं।
मार्क अमेरी

25

मैं इस पर समाप्त हुआ:

function sort_array_of_array(&$array, $subfield)
{
    $sortarray = array();
    foreach ($array as $key => $row)
    {
        $sortarray[$key] = $row[$subfield];
    }

    array_multisort($sortarray, SORT_ASC, $array);
}

फ़ंक्शन को कॉल करें, सरणी को पास करना और दूसरे स्तर के सरणी के क्षेत्र का नाम। पसंद:

sort_array_of_array($inventory, 'price');

1
हा! मैं बस बहुत ज्यादा एक ही बात करता हूं और पोस्ट करने वाला था लेकिन तुम्हारा देखा ... अपवित्र था।
रॉब इवांस

1
डाउनवोटिंग क्योंकि यह ठीक वही समाधान है जो जोश डेविस ने सालों पहले पोस्ट किया था।
मार्क अमेरी

असहमत ... मैंने यह नहीं कहा कि यह एक अलग समाधान है, मैंने सिर्फ इतना कहा कि मैं इस समाधान के साथ समाप्त हो गया और एक पूर्ण कार्य दे रहा हूं।
18

1
@ मार्की मैं कार्यों में निहित जवाब पसंद करता हूं। यह कॉपी पेस्टर्स को कार्यों का उपयोग करने के लिए प्रोत्साहित करता है और उम्मीद है कि कम स्पेगेटी कोड लिख सकता है।
गूज

19

आप usortअनाम फ़ंक्शन के साथ उपयोग कर सकते हैं , जैसे

usort($inventory, function ($a, $b) { return strnatcmp($a['price'], $b['price']); });

संस्करणों PHP 5> = 5.5.0, आप जैसे लोगों के लिए PHP 7, जो वास्तव में उनके लिए काम करना चाहते थे ..
मैट पी

1
उल्लेखनीय है कि strnatcmp, तार की तुलना के लिए, यहाँ ठीक काम करने लगता है। जाहिरा तौर पर "प्राकृतिक क्रम" में यह लागू होता है जिसमें संख्यात्मक रूप से सांकेतिक शब्दों की बजाय सांकेतिक रूप से छांटना शामिल होता है।
मार्क अमेरी

10
$inventory = 
    array(array("type"=>"fruit", "price"=>3.50),
          array("type"=>"milk", "price"=>2.90),
          array("type"=>"pork", "price"=>5.43),
          );

function pricesort($a, $b) {
  $a = $a['price'];
  $b = $b['price'];
  if ($a == $b)
    return 0;
  return ($a > $b) ? -1 : 1;
}

usort($inventory, "pricesort");
// uksort($inventory, "pricesort");

print("first: ".$inventory[0]['type']."\n\n");
// for usort(): prints milk (item with lowest price)
// for uksort(): prints fruit (item with key 0 in the original $inventory)

// foreach prints the same for usort and uksort.
foreach($inventory as $i){
  print($i['type'].": ".$i['price']."\n");
}

आउटपुट:

first: pork

pork: 5.43
fruit: 3.5
milk: 2.9

6

Php में दिए गए कुंजी के मान से साहचर्य सरणियों के एक छाँटे से :

uasort ( http://php.net/uasort ) आपको अपने स्वयं के परिभाषित फ़ंक्शन द्वारा एक सरणी सॉर्ट करने की अनुमति देता है। आपके मामले में, यह आसान है:

$array = array(
  array('price'=>'1000.50','product'=>'test1'),
  array('price'=>'8800.50','product'=>'test2'),
  array('price'=>'200.0','product'=>'test3')
);

function cmp($a, $b) {
  return $a['price'] > $b['price'];
}

uasort($array, "cmp");

1
यह उत्तर कम गुणवत्ता की समीक्षा कतार में बदल गया, संभवतः क्योंकि आप कोड का कोई विवरण प्रदान नहीं करते हैं। यदि यह कोड प्रश्न का उत्तर देता है, तो अपने उत्तर में कोड को समझाते हुए कुछ पाठ जोड़ने पर विचार करें। इस तरह, आपको अधिक उत्थान प्राप्त करने की संभावना है - और प्रश्नकर्ता को कुछ नया सीखने में मदद मिलेगी।
lmo

1
hmpf। यह सबसे अच्छा जवाब है।
आमपिछली

1
-1; cmpसमारोह यहां गलत है। यह माना जाता है कि "एक पूर्णांक से कम, बराबर या शून्य से अधिक है यदि पहले तर्क को क्रमशः से कम, दूसरे के बराबर या उससे अधिक माना जाता है" लेकिन बदले में trueया false। ऐसा लगता है, उल्लेखनीय रूप से, फिर भी काम करने के लिए - शायद, क्योंकि usortऔर दोस्तों का वर्तमान कार्यान्वयन "कम से कम" और "समान रूप से" मामलों को समान रूप से मानता है - लेकिन भविष्य के PHP संस्करणों में काम करने के लिए इस पर भरोसा नहीं करते हैं। यदि वे छंटाई करने की कोशिश करते हैं तो स्थिर होंगे (अर्थात अनावश्यक रूप से समान तत्वों के चारों ओर नहीं घूमें), यह टूट जाएगा।
मार्क अमेरी

इसके अलावा, यहां usortसे अधिक उपयुक्त होगा uasort, क्योंकि uasortकुंजी और मूल्यों के बीच संबंध को संरक्षित करता है जो एक क्रमिक संख्यात्मक सरणी के साथ बहरा होने पर भ्रमित और अप्रत्याशित होता है। उदाहरण के लिए, $arrayकॉल करने के बाद ऊपर के सूचकांक uasort2, 0, और 1 हैं, उसी क्रम में। जब तक आप किसी कारण के लिए चाहते हैं कि, आप शायद अधिक आरामदायक उपयोग करेंगे usort, जो सरणी को पुन: व्यवस्थित करने के साथ-साथ इसे पुन: व्यवस्थित करता है।
मार्क अमेरी

5

100 000 रिकॉर्ड पर परीक्षण किया गया था: सेकंड में समय (फंसीटोन माइक्रोटाइम द्वारा गणना)। केवल महत्वपूर्ण पदों को छाँटने पर अद्वितीय मूल्यों के लिए।

@ जोश डेविस के समारोह का समाधान: समय व्यतीत : 1.5768740177155

मेरा समाधान: खर्च समय : 0.094044923782349

समाधान:

function SortByKeyValue($data, $sortKey, $sort_flags=SORT_ASC)
{
    if (empty($data) or empty($sortKey)) return $data;

    $ordered = array();
    foreach ($data as $key => $value)
        $ordered[$value[$sortKey]] = $value;

    ksort($ordered, $sort_flags);

    return array_values($ordered); *// array_values() added for identical result with multisort*
}

7
अद्वितीय सॉर्ट कुंजी के लिए आवश्यकता एक सौदा ब्रेकर की तरह है, हालांकि। यदि आपके पास अद्वितीय सॉर्ट मान हैं जो कुंजी हो सकते हैं, तो यह सवाल उठता है: उन कुंजियों के साथ सरणी का निर्माण क्यों नहीं करना चाहिए? ओपी के परिदृश्य में, यह कल्पना करना मुश्किल है कि एक ही कीमत वाले दो आइटम असंभव होंगे । यह ध्यान में रखते हुए, इस समाधान का उपयोग करने से सरणी से रहस्यमय तरीके से और चुपचाप हल किए गए परिणाम सेट से आइटम गायब हो जाएंगे।
क्रिस बेकर

@ क्रिस बेकर, आप सही कह रहे हैं। यह केवल अद्वितीय मूल्यों के लिए काम करता है। लेकिन यह समाधान बहुत तेजी से काम करता है, इसलिए गति इसे बनाने और उपयोग करने का कारण थी। फिलहाल यह वास्तविक नहीं है, इसे PHP 7.1.x के साथ जांचने की आवश्यकता है।
नेफेलिम

4

मैं uasortइस तरह का उपयोग करता हूं

<?php
$users = [
    [
        'username' => 'joe',
        'age' => 11
    ],
    [
        'username' => 'rakoto',
        'age' => 21
    ],
    [
        'username' => 'rabe',
        'age' => 17
    ],
    [
        'username' => 'fy',
        'age' => 19
    ],    
];


uasort($users, function ($item, $compare) {
    return $item['username'] >= $compare['username']; 
});

var_dump($users);

3

यह समारोह फिर से प्रयोग करने योग्य है:

function usortarr(&$array, $key, $callback = 'strnatcasecmp') {
    uasort($array, function($a, $b) use($key, $callback) {
        return call_user_func($callback, $a[$key], $b[$key]);
    });
}

यह डिफ़ॉल्ट रूप से स्ट्रिंग मानों पर अच्छी तरह से काम करता है, लेकिन यदि आपके सभी मान संख्याएं हैं , तो आपको एक संख्या तुलना फ़ंक्शन के लिए कॉलबैक को उप करना होगा ।


आप इसे कॉल करते हैं usortarrलेकिन uasortइसके बजाय कॉल करते हैं usort; शायद थोड़ा भ्रमित हो। उत्तरार्द्ध है - संख्यात्मक अनुक्रमित के साथ एक अनुक्रमिक सरणी के मामले में, जैसे कि प्रश्न में प्रदर्शित किया गया है - शायद वही जो वास्तव में चाहते हैं।
मार्क अमेरी

2

आप अपनी खुद की तुलना समारोह को परिभाषित करने की कोशिश कर सकते हैं और फिर उपयोग करें usort


हाँ। अगर मुझे कोई हल नहीं मिल रहा है तो मैं करूँगा। मुझे पूरा यकीन है कि कुछ अजीब पैरामीटर हैं जिन्हें आप इसे पूरा करने के लिए एक तरह से जोड़ सकते हैं। आपके विचारों के लिए धन्यवाद!
मैट

2

यहाँ एक तरीका है जो मैंने बहुत पहले पाया और थोड़ा साफ किया। यह महान काम करता है, और वस्तुओं को भी स्वीकार करने के लिए जल्दी से बदला जा सकता है।

/**
 * A method for sorting arrays by a certain key:value.
 * SortByKey is the key you wish to sort by
 * Direction can be ASC or DESC.
 *
 * @param $array
 * @param $sortByKey
 * @param $sortDirection
 * @return array
 */
private function sortArray($array, $sortByKey, $sortDirection) {

    $sortArray = array();
    $tempArray = array();

    foreach ( $array as $key => $value ) {
        $tempArray[] = strtolower( $value[ $sortByKey ] );
    }

    if($sortDirection=='ASC'){ asort($tempArray ); }
        else{ arsort($tempArray ); }

    foreach ( $tempArray as $key => $temp ){
        $sortArray[] = $array[ $key ];
    }

    return $sortArray;

}

ऑब्जेक्ट को सॉर्ट करने के लिए विधि बदलने के लिए बस निम्नलिखित लाइन को बदलें:

$tempArray[] = strtolower( $value[ $sortByKey ] ); सेवा $tempArray[] = strtolower( $value->$sortByKey );

विधि बस चलाने के लिए

sortArray($inventory,'price','ASC');


यह दृष्टिकोण काम करता है, लेकिन जोश डेविस के जवाब ( array_multisortया) या मेरा (साथ usort) की तुलना में काफी कम संक्षिप्त है और बदले में उन पर कोई लाभ नहीं देता है।
मार्क अमेरी

1
//Just in one line custom function
function cmp($a, $b)
{
return (float) $a['price'] < (float)$b['price'];
}
@uasort($inventory, "cmp");
print_r($inventory);

//result

Array
(
[2] => Array
    (
        [type] => pork
        [price] => 5.43
    )

[0] => Array
    (
        [type] => fruit
        [price] => 3.5
    )

[1] => Array
    (
        [type] => milk
        [price] => 2.9
    )

)

1

इसे इस्तेमाल करे:

$prices = array_column($inventory, 'price');
array_multisort($prices, SORT_DESC, $inventory);
print_r($inventory);

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

0

कम्प्लीट डायनामिक फंक्शन I ने यहाँ साहचर्य सरणी छँटाई के लिए छलांग लगाई और http://php.net/manual/en/function.sort.php पर यह अद्भुत कार्य पाया । यह फ़ंक्शन बहुत गतिशील है जो निर्दिष्ट कुंजी के साथ आरोही और अवरोही क्रम में क्रमबद्ध है।

एक विशिष्ट कुंजी द्वारा एक सरणी को सॉर्ट करने के लिए सरल कार्य। इंडेक्स एसोसिएशन बनाए रखता है

<?php

function array_sort($array, $on, $order=SORT_ASC)
{
    $new_array = array();
    $sortable_array = array();

    if (count($array) > 0) {
        foreach ($array as $k => $v) {
            if (is_array($v)) {
                foreach ($v as $k2 => $v2) {
                    if ($k2 == $on) {
                        $sortable_array[$k] = $v2;
                    }
                }
            } else {
                $sortable_array[$k] = $v;
            }
        }

        switch ($order) {
            case SORT_ASC:
                asort($sortable_array);
            break;
            case SORT_DESC:
                arsort($sortable_array);
            break;
        }

        foreach ($sortable_array as $k => $v) {
            $new_array[$k] = $array[$k];
        }
    }

    return $new_array;
}

$people = array(
    12345 => array(
        'id' => 12345,
        'first_name' => 'Joe',
        'surname' => 'Bloggs',
        'age' => 23,
        'sex' => 'm'
    ),
    12346 => array(
        'id' => 12346,
        'first_name' => 'Adam',
        'surname' => 'Smith',
        'age' => 18,
        'sex' => 'm'
    ),
    12347 => array(
        'id' => 12347,
        'first_name' => 'Amy',
        'surname' => 'Jones',
        'age' => 21,
        'sex' => 'f'
    )
);

print_r(array_sort($people, 'age', SORT_DESC)); // Sort by oldest first
print_r(array_sort($people, 'surname', SORT_ASC)); // Sort by surname

-1
$arr1 = array(

    array('id'=>1,'name'=>'aA','cat'=>'cc'),
    array('id'=>2,'name'=>'aa','cat'=>'dd'),
    array('id'=>3,'name'=>'bb','cat'=>'cc'),
    array('id'=>4,'name'=>'bb','cat'=>'dd')
);

$result1 = array_msort($arr1, array('name'=>SORT_DESC);

$result2 = array_msort($arr1, array('cat'=>SORT_ASC);

$result3 = array_msort($arr1, array('name'=>SORT_DESC, 'cat'=>SORT_ASC));


function array_msort($array, $cols)
{
    $colarr = array();
    foreach ($cols as $col => $order) {
    $colarr[$col] = array();
    foreach ($array as $k => $row) { $colarr[$col]['_'.$k] = strtolower($row[$col]); }
}

$eval = 'array_multisort(';

foreach ($cols as $col => $order) {
    $eval .= '$colarr[\''.$col.'\'],'.$order.',';
}

$eval = substr($eval,0,-1).');';
eval($eval);
$ret = array();
foreach ($colarr as $col => $arr) {
    foreach ($arr as $k => $v) {
        $k = substr($k,1);
        if (!isset($ret[$k])) $ret[$k] = $array[$k];
        $ret[$k][$col] = $array[$k][$col];
    }
}
return $ret;


} 

हालांकि यह कोड स्निपेट प्रश्न को हल कर सकता है, जिसमें स्पष्टीकरण सहित वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है। कृपया अपने कोड को व्याख्यात्मक टिप्पणियों के साथ भीड़ न दें, क्योंकि इससे कोड और स्पष्टीकरण दोनों की पठनीयता कम हो जाती है!
गुडबाय StackExchange

-5

इसे इस्तेमाल करे:

asort($array_to_sort, SORT_NUMERIC);

संदर्भ के लिए इसे देखें: http://php.net/manual/en/function.asort.php

विभिन्न प्रकार के झंडे यहां देखें: http://www.php.net/manual/en/function.sort.php


यह बहुआयामी सरणियों के लिए काम नहीं करेगा, लेकिन सिर्फ एक और समस्या के लिए मेरी मदद की, धन्यवाद :)
schellmax

4
इसका उपयोग किसी विशेष शब्दकोश कुंजी द्वारा शब्दकोशों की सूची को सॉर्ट करने के लिए नहीं किया जा सकता है, और इसलिए इस प्रश्न का उत्तर नहीं दिया जाता है।
मार्क अमेरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.