PHP सबर्रे वैल्यू के आधार पर सॉर्ट करें


110

मेरे पास निम्न सरणी संरचना है:

Array
        (
            [0] => Array
                (
                    [configuration_id] => 10
                    [id] => 1
                    [optionNumber] => 3
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [1] => Array
                (
                    [configuration_id] => 9
                    [id] => 1
                    [optionNumber] => 2
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [2] => Array
                (
                    [configuration_id] => 8
                    [id] => 1
                    [optionNumber] => 1
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )
    )

एक वृद्धिशील तरीके से सरणी को ऑर्डर करने का सबसे अच्छा तरीका क्या है, इसके आधार पर optionNumber ?

तो परिणाम इस तरह दिखते हैं:

Array
        (
            [0] => Array
                (
                    [configuration_id] => 8
                    [id] => 1
                    [optionNumber] => 1
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [1] => Array
                (
                    [configuration_id] => 9
                    [id] => 1
                    [optionNumber] => 2
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )

            [2] => Array
                (
                    [configuration_id] => 10
                    [id] => 1
                    [optionNumber] => 3
                    [optionActive] => 1
                    [lastUpdated] => 2010-03-17 15:44:12
                )
    )

जवाबों:


204

का उपयोग करें usort

function cmp_by_optionNumber($a, $b) {
  return $a["optionNumber"] - $b["optionNumber"];
}

...

usort($array, "cmp_by_optionNumber");

PHP .35.3 में, आपको इसके बजाय एक अनाम फ़ंक्शन का उपयोग करना चाहिए :

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

ध्यान दें कि दोनों कोड ऊपर मान $a['optionNumber']एक पूर्णांक है। @St का प्रयोग करें जॉन जॉनसन का समाधान अगर वे तार हैं।


PHP instead7.0 में, अतिप्रवाह / छंटनी की समस्याओं को रोकने के लिए घटाव के बजाय स्पेसशिप ऑपरेटर का<=> उपयोग करें ।

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

1
यह वास्तव में मेरी मदद नहीं करता है क्योंकि usort के लिए मुझे इसका उपयोग करने के लिए एक फ़ंक्शन प्रदान करने की आवश्यकता है - जो कि मुश्किल सा है जिसे मैं अपना सिर गोल नहीं कर सकता हूं
Sjwdavies

17
खैर उसने आपको सिर्फ उपयोग करने के लिए फंक्शन दिया। और आपको यह स्वीकार करना होगा कि हमेशा एक अंतर्निहित फ़ंक्शन नहीं होता है जो आप चाहते हैं, आपको इसे स्वयं लिखना होगा। तुलनात्मक कार्यों के लिए केवल 1, 0 या -1 की वापसी की आवश्यकता होती है, जो दो तत्वों के लिए क्रमबद्ध क्रम को दर्शाता है।
Tesserex

1
मैंने आगे और बेकार में देखा और यह वास्तव में काफी अच्छा है। मैंने ऊपर वाले के लिए एक सरल तुलनात्मक फ़ंक्शन लिखा था, हालांकि '==' याद किया। मदद लोगों के लिए धन्यवाद
Sjwdavies

3
अब भी बंद होने के रूप में: - usort ($ array, function ($ a, $ b) {return $ b ["optionNumber"] - $ a ["optionNumber"];});
जोएरी

1
@ KiloumapL'artélon यदि परिणाम है < 0, तो यह उस प्रकार के फ़ंक्शन को बताता है जो aपहले प्रकट होना चाहिए b। यदि ऐसा है > 0तो bपहले प्रकट होना चाहिए a
kennytm

57

उपयोग usort

 usort($array, 'sortByOption');
 function sortByOption($a, $b) {
   return strcmp($a['optionNumber'], $b['optionNumber']);
 }

7
@BenSinclair, ऐसा इसलिए है क्योंकि केनी का समाधान संख्याओं के लिए है, यह समाधान तारों के लिए है। वे इस विकल्प के लिए दोनों सही :-) +1 हैं।
कुबिलाई

मामले के लिए असंवेदनशील प्रकार strcmp के बजाय strcasecmp का उपयोग करें
user570605

क्या हम सरणी में दूसरे क्रम के लिए कुंजी को परिभाषित कर सकते हैं इसका मतलब है कि हम पहले विकल्प के साथ छँटाई करते हैं और फिर अंतिम छँटाई के साथ छँटाई करते हैं। यह बात कैसे हो सकती है?
भाविन थुम्मर

16

मैंने केनीटीएम और एजे क्विक द्वारा दोनों समाधानों का उपयोग किया और एक फ़ंक्शन के साथ आया, जो इस मामले में कई मामलों के लिए मदद कर सकता है जैसे कि ASC या DESC सॉर्ट करना या कुंजियों का संरक्षण करना या यदि आपके पास सरणी के बच्चे के रूप में ऑब्जेक्ट हैं।

यहाँ यह फ़ंक्शन (PHP7 के लिए काम करता है और स्पेसशिप ऑपरेटर की वजह से अधिक है):

/**
 * @param array $array
 * @param string $value
 * @param bool $asc - ASC (true) or DESC (false) sorting
 * @param bool $preserveKeys
 * @return array
 * */
function sortBySubValue($array, $value, $asc = true, $preserveKeys = false)
{
    if ($preserveKeys) {
        $c = [];
        if (is_object(reset($array))) {
            foreach ($array as $k => $v) {
                $b[$k] = strtolower($v->$value);
            }
        } else {
            foreach ($array as $k => $v) {
                $b[$k] = strtolower($v[$value]);
            }
        }
        $asc ? asort($b) : arsort($b);
        foreach ($b as $k => $v) {
            $c[$k] = $array[$k];
        }
        $array = $c;
    } else {
        if (is_object(reset($array))) {
            usort($array, function ($a, $b) use ($value, $asc) {
                return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} <=> $b->{$value}) * ($asc ? 1 : -1);
            });
        } else {
            usort($array, function ($a, $b) use ($value, $asc) {
                return $a[$value] == $b[$value] ? 0 : ($a[$value] <=> $b[$value]) * ($asc ? 1 : -1);
            });
        }
    }

    return $array;
}

उपयोग:

sortBySubValue($array, 'optionNumber', true, false);

संपादित करें

पहले भाग का उपयोग करके फिर से लिखा जा सकता है uasort()और फ़ंक्शन कम होगा (PHP7 के लिए काम करता है और स्पेसशिप ऑपरेटर की वजह से अधिक होता है):

/**
 * @param array $array
 * @param string $value
 * @param bool $asc - ASC (true) or DESC (false) sorting
 * @param bool $preserveKeys
 * @return array
 * */
function sortBySubValue($array, $value, $asc = true, $preserveKeys = false)
{
    if (is_object(reset($array))) {
        $preserveKeys ? uasort($array, function ($a, $b) use ($value, $asc) {
            return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} <=> $b->{$value}) * ($asc ? 1 : -1);
        }) : usort($array, function ($a, $b) use ($value, $asc) {
            return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} <=> $b->{$value}) * ($asc ? 1 : -1);
        });
    } else {
        $preserveKeys ? uasort($array, function ($a, $b) use ($value, $asc) {
            return $a[$value] == $b[$value] ? 0 : ($a[$value] <=> $b[$value]) * ($asc ? 1 : -1);
        }) : usort($array, function ($a, $b) use ($value, $asc) {
            return $a[$value] == $b[$value] ? 0 : ($a[$value] <=> $b[$value]) * ($asc ? 1 : -1);
        });
    }
    return $array;
}

यह यहाँ सबसे अच्छा उपयोगी उत्तर है, शीर्ष पर होना चाहिए;)
एडी बुदिमिलिक

@EdiBudimilic धन्यवाद, मैं इसकी सराहना करता हूँ! वैसे मैंने अपना उत्तर अपडेट कर दिया है और इस समारोह का एक छोटा संस्करण जोड़ा :)
पिगलेव पावेल

1
मेरे लिए यह काम करने के लिए, मुझे (माइनस) के >बजाय -(शून्य से अधिक) का उपयोग करना पड़ा जब मैं $aऔर $bतार की तुलना की गई थी। हालांकि अभी भी काम करता है।
जेम्स

1
@ आप सही हैं। मैंने उत्तर बदल दिया और स्पेसशिप ऑपरेटर (<=>) के उपयोग को जोड़ दिया। अब यह ठीक काम करना चाहिए।
पिगलेव पावेल

क्या इस मामले को असंवेदनशील बनाने का कोई तरीका है?
लोफेल

4

उपरोक्त जैसे फ़ंक्शन का उपयोग करते समय चाबियाँ हटा दी जाती हैं। यदि कुंजियाँ महत्वपूर्ण हैं, तो निम्न फ़ंक्शन इसे बनाए रखेगा ... लेकिन फ़ॉरच लूप बहुत अक्षम हैं।

function subval_sort($a,$subkey) {
    foreach($a as $k=>$v) {
        $b[$k] = strtolower($v[$subkey]);
    }
    asort($b);
    foreach($b as $key=>$val) {
        $c[$key] = $a[$key];
    }
    return $c;
}
$array = subval_sort($array,'optionNumber');

अगर आप हाई से लो चाहते हैं तो एस्कॉर्ट की जगह आर्सेटर का इस्तेमाल करें।

कोड क्रेडिट: http://www.firsttube.com/read/sorting-a-multi-dimunning-array-with-php/


4

Array_multisort (), array_map () का उपयोग करना

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

print_r($array);

डेमो


2
यह बहुत आसानी से काम करता है। धन्यवाद। मुझे बस इतना करना था कि मैं अपने कॉलम का नाम बदल दूं और यह काम कर गया।
कोबस मायबर्ग

2
यह मूल सरणी के लिए कुंजियाँ भी सुरक्षित रखता है
जॉनी

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