मूल्य द्वारा बहु-आयामी सरणी को कैसे सॉर्ट करें?


1129

मैं "ऑर्डर" कुंजी के मूल्य से इस सरणी को कैसे सॉर्ट कर सकता हूं? भले ही मूल्य वर्तमान में अनुक्रमिक हैं, वे हमेशा नहीं रहेंगे।

Array
(
    [0] => Array
        (
            [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
            [title] => Flower
            [order] => 3
        )

    [1] => Array
        (
            [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
            [title] => Free
            [order] => 2
        )

    [2] => Array
        (
            [hashtag] => e7d31fc0602fb2ede144d18cdffd816b
            [title] => Ready
            [order] => 1
        )
)


सबसे तेज़ तरीका आइसोमॉर्फिक सॉर्ट-एरे- मॉड्यूल का उपयोग करना है जो किसी भी प्रकार के इनपुट, कंप्यूटेड फ़ील्ड और कस्टम सॉर्ट ऑर्डर का समर्थन करते हुए ब्राउज़र और नोड दोनों में मूल रूप से काम करता है।
लॉयड

जवाबों:


1731

एक usort का प्रयास करें , यदि आप अभी भी PHP 5.2 या उससे पहले के हैं, तो आपको पहले एक छँटाई फ़ंक्शन को परिभाषित करना होगा:

function sortByOrder($a, $b) {
    return $a['order'] - $b['order'];
}

usort($myArray, 'sortByOrder');

PHP 5.3 में शुरू, आप एक अनाम फ़ंक्शन का उपयोग कर सकते हैं:

usort($myArray, function($a, $b) {
    return $a['order'] - $b['order'];
});

और अंत में PHP 7 के साथ आप स्पेसशिप ऑपरेटर का उपयोग कर सकते हैं :

usort($myArray, function($a, $b) {
    return $a['order'] <=> $b['order'];
});

इसे बहुआयामी छँटाई के लिए विस्तारित करने के लिए, दूसरे / तीसरे छँटाई वाले तत्वों का संदर्भ लें यदि पहला शून्य है - नीचे सबसे अच्छा समझाया गया है। आप उप-तत्वों पर छंटाई के लिए भी इसका उपयोग कर सकते हैं।

usort($myArray, function($a, $b) {
    $retval = $a['order'] <=> $b['order'];
    if ($retval == 0) {
        $retval = $a['suborder'] <=> $b['suborder'];
        if ($retval == 0) {
            $retval = $a['details']['subsuborder'] <=> $b['details']['subsuborder'];
        }
    }
    return $retval;
});

यदि आपको प्रमुख संघों को बनाए रखने की आवश्यकता है, तो उपयोग करें uasort()- मैनुअल में सरणी सॉर्टिंग फ़ंक्शन की तुलना देखें


2
मेरा काम करना थोड़ा बंद है, मैं इसे संपादित करूँगा। मेरा मतलब है कि अगर आप PHP 5.3 पर नहीं हैं, तो आपको इस विशेष छंटाई के लिए एक विशेष फ़ंक्शन बनाने की आवश्यकता है (जो किसी भी तरह बहुत सुंदर नहीं है)। अन्यथा आप वहीं अनाम फ़ंक्शन का उपयोग कर सकते हैं।
ईसाई अध्ययनकर्ता

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

61
Protip: uasort()सरणी कुंजियों को संरक्षित करना चाहते हैं, तो उपयोग करें।
thaddeusmt

15
यदि क्रमागत मान दशमलव संख्याएँ हैं, तो सावधान रहें। यदि सॉर्टिंग फ़ंक्शन को $ a = 1 और $ b = 0.1 मिलता है, तो अंतर 0.9 होता है, लेकिन फ़ंक्शन एक इंट देता है, इस मामले में 0, इसलिए $ a और $ b को समान माना जाता है और गलत तरीके से सॉर्ट किया जाता है। यह तुलना करना अधिक विश्वसनीय है कि क्या $ a $ b या बराबर से बड़ा है, और तदनुसार -1, 1 या 0 लौटाएं।
ग्रीनलैंडि

37
मुझे पता लगाने में थोड़ा समय लगा। रिवर्स ऑर्डर (DESC) को सॉर्ट करने के लिए आप $ a और $ b स्विच कर सकते हैं। तो $ b ['आदेश'] - $ a ['ऑर्डर ’]
JanWillem

285
function aasort (&$array, $key) {
    $sorter=array();
    $ret=array();
    reset($array);
    foreach ($array as $ii => $va) {
        $sorter[$ii]=$va[$key];
    }
    asort($sorter);
    foreach ($sorter as $ii => $va) {
        $ret[$ii]=$array[$ii];
    }
    $array=$ret;
}

aasort($your_array,"order");

7
@ noc2spam मुझे मदद करने में खुशी हो रही है, लेकिन स्टूडियो के सुझाव का पालन ​​करने पर विचार करें जो संभवतः अधिक कुशल और निश्चित रूप से अधिक सुव्यवस्थित है!
ओ ० '।

1
@Lhoris यकीन है कि दोस्त मैं भी है कि बाहर की जाँच कर रहा हूँ। कल कार्यालय में एक कठिन दिन होता अगर मुझे यह सवाल नहीं मिला :-)
गोगोल

हम्म खिचड़ी भाषा में एक उत्तर जोड़ें .. अच्छी तरह से मैं इसे यहाँ डाल देता हूँ coz मुझे उन बेवकूफ बिंदुओं की आवश्यकता नहीं है: इसलिए एक बहुआयामी प्रकार के लिए इसकी (लगभग) एक ही चीज़ (आपको पेस्ट और सुधार को कॉपी करना होगा): फ़ंक्शन एस्कॉर्ट (और $ सरणी); , $ key1, $ key2, $ key3) {$ sorter = array (); $ सेवानिवृत्त = सरणी (); रीसेट ($ सरणी); foreach ($ array as $ ii => $ va) {$ sorter [$ ii] = getPrice ($ va [$ key1] [$ key2] [$ key3]); } आरसोर्ट ($ सॉर्टर); foreach ($ sorter के रूप में $ ii => $ va) {$ ret [$ ii] = $ array [$ ii]; } $ सरणी = $ रिट; }
जैक्सएक्स0 आरआर

3
उपरोक्त उत्तर की तुलना में लागू करने के लिए बहुत आसान है
मार्सेल

1
आप कमाल के है!! PHP 7.2 के लिए बहुत पसंद करते हैं। एक बहुत बड़ा :) :)
कमलेश

270

मैं इस फ़ंक्शन का उपयोग करता हूं:

function array_sort_by_column(&$arr, $col, $dir = SORT_ASC) {
    $sort_col = array();
    foreach ($arr as $key=> $row) {
        $sort_col[$key] = $row[$col];
    }

    array_multisort($sort_col, $dir, $arr);
}


array_sort_by_column($array, 'order');

3
बहुत अच्छा काम करता है। एक अनोखा समाधान एक तरह की दिशा जोड़ने में सक्षम है। धन्यवाद!
इवो ​​परेरा

2
एक ऐसे विकल्प के लिए जो क्रमबद्ध दिशा-निर्देशों और बहुत सारी अतिरिक्त विशेषताओं का समर्थन करता है, आप यहाँ मेरे उत्तर पर एक नज़र डालना चाहते हैं - इसका यह भी फायदा है कि इसका उपयोग नहीं होता है array_multisortऔर इस प्रकार $sort_colसमय और मेमोरी को बचाने के लिए प्रचार करने की आवश्यकता नहीं होती है ।
जॉन

मेरे लिए महान काम करता है, लेकिन ... &$arrइसके बजाय सिर्फ निर्दिष्ट करना क्यों आवश्यक है $arr?
रादु मुराज़े

2
@RaduMurzea तो एरे संदर्भ द्वारा पारित किया जाता है और फ़ंक्शन द्वारा एक कॉपी प्राप्त करने के बजाय फ़ंक्शन द्वारा संशोधित किया जा सकता है
टॉम हैघ

1
@AdrianP। : सरणी को संदर्भ द्वारा पारित किया जाता है, इसलिए यह
छँटाई गई

72

मैं आमतौर पर usort का उपयोग करता हूं , और अपना स्वयं का तुलनात्मक फ़ंक्शन पास करता हूं। इस मामले में, यह बहुत आसान है:

function compareOrder($a, $b)
{
  return $a['order'] - $b['order'];
}
usort($array, 'compareOrder');

PHP 7 में स्पेसशिप ऑपरेटर का उपयोग करके:

usort($array, function($a, $b) {
    return $a['order'] <=> $b['order'];
});

4
डेमिट, मैं 30 सेकंड धीमा था। हालांकि यह $ a - $ b नहीं है?
क्रिश्चियन स्टडर

3
मुझे हमेशा यह गलत लगता है। मुझे मैनुअल से लगता है: यदि पहले तर्क को दूसरे से कम माना जाता है, तो वापसी मूल्य शून्य से कम होना चाहिए। तो अगर $a['order']3 है, और $b['order']6 है, तो मैं -3 वापस आऊंगा। सही बात?
जान फेब्री

3
ठीक है, आप b - a लौटाते हैं, तो यह 3 होगा। और इस तरह गलत तरीके से हल किया गया।
ईसाई अध्ययनकर्ता

26
आह। ठीक। मैं गैर-तार्किक अंकगणित का उपयोग कर रहा था, जहां आपके सिर में विचार आपके द्वारा उत्पादित शब्दों से मेल नहीं खाता है। यह शुक्रवार दोपहर में सबसे अधिक बार अध्ययन किया जाता है।
Jan Fabry

कुछ मामलों में उपरोक्त उत्तर गलत परिणाम है .. संदर्भ stackoverflow.com/questions/50636981/…
बिलाल अहमद

45

इसे प्राप्त करने के लिए एक दृष्टिकोण इस तरह होगा

    $new = [
              [
                'hashtag' => 'a7e87329b5eab8578f4f1098a152d6f4',
                'title' => 'Flower',
                'order' => 3,
              ],

              [
                'hashtag' => 'b24ce0cd392a5b0b8dedc66c25213594',
                'title' => 'Free',
                'order' => 2,
              ],

              [
                'hashtag' => 'e7d31fc0602fb2ede144d18cdffd816b',
                'title' => 'Ready',
                'order' => 1,
              ],
    ];

    $keys = array_column($new, 'order');

    array_multisort($keys, SORT_ASC, $new);

    var_dump($new);

परिणाम:

    Array
    (
        [0] => Array
            (
                [hashtag] => e7d31fc0602fb2ede144d18cdffd816b
                [title] => Ready
                [order] => 1
            )

        [1] => Array
            (
                [hashtag] => b24ce0cd392a5b0b8dedc66c25213594
                [title] => Free
                [order] => 2
            )

        [2] => Array
            (
                [hashtag] => a7e87329b5eab8578f4f1098a152d6f4
                [title] => Flower
                [order] => 3
            )

    )

18

"शीर्षक" कुंजी उपयोग के मूल्य द्वारा सरणी को सॉर्ट करने के लिए:

uasort($myArray, function($a, $b) {
    return strcmp($a['title'], $b['title']);
});

strcmp स्ट्रिंग्स की तुलना करें।

uasort () के रूप में वे परिभाषित किया गया सरणी कुंजी रखता है।


strcmp varchar प्रकारों के लिए एक उल्लेखनीय मदद है, मुझे यह उत्तर लघु और तेज़ के लिए पसंद आया
StudioX

17
$sort = array();
$array_lowercase = array_map('strtolower', $array_to_be_sorted);
array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $alphabetically_ordered_array);

यह ऊपरी और निचले मामले के अक्षर दोनों का ख्याल रखता है।


4
यह किसी विशेष सरणी कुंजी द्वारा छंटनी के प्रश्न का उत्तर कैसे देता है?
सीनो

12

उपयोग करें array_multisort(),array_map()

array_multisort(array_map(function($element) {
      return $element['order'];
  }, $array), SORT_ASC, $array);

print_r($array);

डेमो


ध्यान दें कि यह दृष्टिकोण एक नोटिस का उत्सर्जन करेगा। array_multisortसंदर्भ यह पहला पैरामीटर है।
कामी यांग

5

सबसे लचीला दृष्टिकोण इस पद्धति का उपयोग करना होगा

Arr::sortByKeys(array $array, $keys, bool $assoc = true): array

यहाँ पर क्यों:

  • आप किसी भी कुंजी के आधार पर छाँट सकते हैं (जैसे नेस्टेड 'key1.key2.key3'या ['k1', 'k2', 'k3'])

  • सहयोगी और साहचर्य सरणियों ( $assocध्वज) पर दोनों काम करता है

  • यह संदर्भ का उपयोग नहीं करता है - नए क्रमबद्ध सरणी लौटाएं

आपके मामले में यह उतना ही सरल होगा:

$sortedArray = Arr::sortByKeys($array, 'order');

यह विधि इस पुस्तकालय का एक हिस्सा है ।


1

चलो इसका सामना करते हैं: हर सरणी सॉर्ट परिदृश्य को ठीक से हैंडल करने के लिए php के पास बॉक्स फ़ंक्शन का एक सरल आउट नहीं है।

यह दिनचर्या सहज है, जिसका अर्थ है तेजी से डिबगिंग और रखरखाव:

// automatic population of array
$tempArray = array();
$annotations = array();
// ... some code
// SQL $sql retrieves result array $result 
// $row[0] is the ID, but is populated out of order (comes from 
// multiple selects populating various dimensions for the same DATE 
// for example
while($row = mysql_fetch_array($result)) {
    $needle = $row[0];
    arrayIndexes($needle);  // create a parallel array with IDs only
    $annotations[$needle]['someDimension'] = $row[1]; // whatever
}
asort($tempArray);
foreach ($tempArray as $arrayKey) {
    $dataInOrder = $annotations[$arrayKey]['someDimension']; 
    // .... more code
}

function arrayIndexes ($needle) {
    global $tempArray;
    if (!in_array($needle,$tempArray)) {
        array_push($tempArray,$needle);
    }
}

4
"चलो इसे सामना करते हैं: हर सरणी सॉर्ट परिदृश्य को ठीक से संभालने के लिए php के पास बॉक्स फ़ंक्शन का एक सरल आउट नहीं है।" बिलकुल यही usort / ksort / asort ^ ^ 'के लिए डिज़ाइन किए गए हैं
बेन कैसिनेट

3
वास्तव में PHP में बहुत सारे छंटाई कार्य हैं जिनका उपयोग हर सरणी सॉर्ट परिदृश्य को संभालने के लिए किया जा सकता है।
axiac

डिबगिंग और रखरखाव के संबंध में, globalएक विशाल लाल ध्वज का उपयोग होता है और आमतौर पर हतोत्साहित किया जाता हैmysql_fetch_arrayओपी के स्रोत सरणी के बजाय इस प्रश्न के लिए क्यों प्रदर्शन किया जा रहा है, और इस बात का कोई स्पष्टीकरण नहीं है कि आपका कोड क्या कर रहा है और कोई भी परिणाम होने की उम्मीद कर सकता है? कुल मिलाकर यह वांछित अंतिम परिणाम प्राप्त करने के लिए एक बहुत ही जटिल दृष्टिकोण है।
fyrye

@tonygil मैं यह निर्धारित नहीं कर पा रहा हूं कि आपके उत्तर और ओपी के डेटासेट से आपके अपेक्षित परिणाम क्या हैं। यह आपके लिए स्पष्ट हो सकता है, लेकिन मुझे नहीं पता कि आपका जवाब ओपी के सवाल का जवाब कैसे देता है। हालाँकि, आप देखें: 3v4l.org/FEeFC का उपयोग करके इसके बजाय संदर्भ को पास कर सकते हैं। यह स्पष्ट रूप से परिभाषित चर का उत्पादन करता है, बजाय एक जिसे बदले और विश्व स्तर पर पहुँचा जा सकता है। global
fyrye

0

आप भी कई मूल्यों के लिए बहुआयामी सरणी को सॉर्ट कर सकते हैं जैसे कि

$arr = [
    [
        "name"=> "Sally",
        "nick_name"=> "sal",
        "availability"=> "0",
        "is_fav"=> "0"
    ],
    [
        "name"=> "David",
        "nick_name"=> "dav07",
        "availability"=> "0",
        "is_fav"=> "1"
    ],
    [
        "name"=> "Zen",
        "nick_name"=> "zen",
        "availability"=> "1",
        "is_fav"=> "0"
    ],
    [
        "name"=> "Jackson",
        "nick_name"=> "jack",
        "availability"=> "1",
        "is_fav"=> "1"
    ],
    [
        "name"=> "Rohit",
        "nick_name"=> "rod",
        "availability"=> "0",
        "is_fav"=> "0"
    ],

];

साथ में

usort($arr,function($a,$b){
    $c = $b['is_fav'] - $a['is_fav'];
    $c .= $b['availability'] - $a['availability'];
    $c .= strcmp($a['nick_name'],$b['nick_name']);
    return $c;
});

उत्पादन का उपयोग print_r($arr):

Array
(
    [0] => Array
        (
            [name] => Jackson
            [nick_name] => jack
            [availability] => 1
            [is_fav] => 1
        )

    [1] => Array
        (
            [name] => David
            [nick_name] => dav07
            [availability] => 0
            [is_fav] => 1
        )

    [2] => Array
        (
            [name] => Zen
            [nick_name] => zen
            [availability] => 1
            [is_fav] => 0
        )

    [3] => Array
        (
            [name] => Rohit
            [nick_name] => rod
            [availability] => 0
            [is_fav] => 0
        )

    [4] => Array
        (
            [name] => Sally
            [nick_name] => sal
            [availability] => 0
            [is_fav] => 0
        )

)

PS) स्ट्रिंग्स की तुलना करने के लिए strcmp का उपयोग करना एक अच्छा विकल्प होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.