मैं PHP में एक बहुआयामी ऐरे कैसे क्रमबद्ध करूं?

मेरे पास एक बहुआयामी सरणी में लोड सीएसवी डेटा है। इस तरह प्रत्येक "पंक्ति" एक रिकॉर्ड होता है और प्रत्येक "कॉलम" में एक ही प्रकार का डेटा होता है। मैं अपनी सीएसवी फ़ाइल लोड करने के लिए नीचे दिए गए फ़ंक्शन का उपयोग कर रहा हूं।

function f_parse_csv($file, $longest, $delimiter)
{
  $mdarray = array();
  $file    = fopen($file, "r");
  while ($line = fgetcsv($file, $longest, $delimiter))
  {
    array_push($mdarray, $line);
  }
  fclose($file);
  return $mdarray;
}

मुझे क्रमबद्ध करने के लिए एक कॉलम निर्दिष्ट करने में सक्षम होना चाहिए ताकि यह पंक्तियों को पुनर्व्यवस्थित कर सके। कॉलम में से एक में वाई-एम-डी एच: i: s के प्रारूप में दिनांक जानकारी शामिल है और मैं पहली पंक्ति होने वाली सबसे हाल की तारीख को सॉर्ट करने में सक्षम होना चाहता हूं।

0
(2 साल बाद ...) यदि आप स्ट्रिंग्स के रूप में संग्रहीत तिथियों को सॉर्ट कर रहे हैं, तो आपको पहले स्ट्रेटोटाइम [1] docs.php.net/manual/en/function.strtotime.php
जोड़ा लेखक Dan Burton, स्रोत

11 उत्तर

usort के साथ। यहां एक सामान्य समाधान है, जिसे आप विभिन्न कॉलम के लिए उपयोग कर सकते हैं:

class TableSorter {
  protected $column;
  function __construct($column) {
    $this->column = $column;
  }
  function sort($table) {
    usort($table, array($this, 'compare'));
    return $table;
  }
  function compare($a, $b) {
    if ($a[$this->column] == $b[$this->column]) {
      return 0;
    }
    return ($a[$this->column] < $b[$this->column]) ? -1 : 1;
  }
}

पहले कॉलम द्वारा सॉर्ट करने के लिए:

$sorter = new TableSorter(0);//sort by first column
$mdarray = $sorter->sort($mdarray);
0
जोड़ा
"टेबल" के साथ "var" और "__construct" के साथ "protrected" को बदलें, और यह PHP4 में काम करेगा। हालांकि, ध्यान दें कि PHP4 बंद है।
जोड़ा लेखक troelskn, स्रोत
मुझे पार्स त्रुटि मिलती है: उस वर्ग की दूसरी पंक्ति पर TseOLD त्रुटि, अप्रत्याशित T_STRING, T_OLD_FUNCTION या T_FUNCTION या T_VAR या '}' की अपेक्षा है।
जोड़ा लेखक Melikoth, स्रोत
मैं PHP को v5 पर सेट करता हूं, यह नहीं पता था कि यह डिफ़ॉल्ट रूप से v4 चला रहा था। थोड़ी देर के लिए इसे देखते हुए मुझे लगता है कि मैं समझता हूं कि विभिन्न प्रकार के प्रकारों के लिए इसे कैसे संशोधित किया जाए
जोड़ा लेखक Melikoth, स्रोत
इस कोड को php5 की आवश्यकता है
जोड़ा लेखक Devon, स्रोत

इससे पहले कि मैं टेबलस्टर कक्षा को चलाने के लिए प्राप्त कर सकूं, मैं शिनहान द्वारा प्रदान किए गए कार्यों के आधार पर एक फ़ंक्शन के साथ आया था।

function sort2d_bycolumn($array, $column, $method, $has_header)
  {
  if ($has_header)  $header = array_shift($array);
  foreach ($array as $key => $row) {
    $narray[$key]  = $row[$column]; 
    }
  array_multisort($narray, $method, $array);
  if ($has_header) array_unshift($array, $header);
  return $array;
  }
  • $ सरणी एमडी ऐरे है जिसे आप सॉर्ट करना चाहते हैं।
  • $ कॉलम वह कॉलम है जिसे आप सॉर्ट करना चाहते हैं।
  • $ विधि यह है कि आप कैसे क्रमबद्ध करना चाहते हैं, जैसे SORT_DESC
  • $ has_header को सत्य पर सेट किया गया है यदि पहली पंक्ति में हेडर मान हैं जिन्हें आप सॉर्ट नहीं करना चाहते हैं।
0
जोड़ा

बंद करने का उपयोग कर एकाधिक पंक्ति सॉर्टिंग

Uasort() और एक अनाम कॉलबैक फ़ंक्शन (बंद) का उपयोग करके एक और तरीका यहां दिया गया है। मैंने नियमित रूप से उस समारोह का उपयोग किया है। PHP 5.3 आवश्यक - कोई और निर्भरता नहीं!

/**
 * Sorting array of associative arrays - बंद करने का उपयोग कर एकाधिक पंक्ति सॉर्टिंग.
 * See also: http://the-art-of-web.com/php/sortarray/
 *
 * @param array $data input-array
 * @param string|array $fields array-keys
 * @license Public Domain
 * @return array
 */
function sortArray( $data, $field ) {
    $field = (array) $field;
    uasort( $data, function($a, $b) use($field) {
        $retval = 0;
        foreach( $field as $fieldname ) {
            if( $retval == 0 ) $retval = strnatcmp( $a[$fieldname], $b[$fieldname] );
        }
        return $retval;
    } );
    return $data;
}

/* example */
$data = array(
    array( "firstname" => "Mary", "lastname" => "Johnson", "age" => 25 ),
    array( "firstname" => "Amanda", "lastname" => "Miller", "age" => 18 ),
    array( "firstname" => "James", "lastname" => "Brown", "age" => 31 ),
    array( "firstname" => "Patricia", "lastname" => "Williams", "age" => 7 ),
    array( "firstname" => "Michael", "lastname" => "Davis", "age" => 43 ),
    array( "firstname" => "Sarah", "lastname" => "Miller", "age" => 24 ),
    array( "firstname" => "Patrick", "lastname" => "Miller", "age" => 27 )
);

$data = sortArray( $data, 'age' );
$data = sortArray( $data, array( 'lastname', 'firstname' ) );
0
जोड़ा

परिचय: PHP 5.3+ के लिए एक बहुत ही सामान्यीकृत समाधान

मैं यहां अपना स्वयं का समाधान जोड़ना चाहता हूं, क्योंकि यह उन सुविधाओं की पेशकश करता है जो अन्य उत्तरों नहीं करते हैं।

विशेष रूप से, इस समाधान के फायदों में शामिल हैं:

  1. यह पुन: प्रयोज्य है: आप सॉर्ट कॉलम को हार्डकोडिंग के बजाय चर के रूप में निर्दिष्ट करते हैं।
  2. यह लचीला है: आप कई प्रकार के कॉलम निर्दिष्ट कर सकते हैं (जितना आप चाहते हैं) - अतिरिक्त कॉलम का उपयोग उन वस्तुओं के बीच tiebreakers के रूप में किया जाता है जो प्रारंभ में बराबर तुलना करते हैं।
  3. यह उलटा है: आप निर्दिष्ट कर सकते हैं कि क्रम को प्रत्येक कॉलम के लिए अलग-अलग किया जाना चाहिए।
  4. यह एक्स्टेंसिबल है: यदि डेटा सेट में कॉलम होते हैं जिन्हें "गूंगा" तरीके से तुलना नहीं किया जा सकता है (जैसे डेट स्ट्रिंग्स) आप यह भी निर्दिष्ट कर सकते हैं कि इन आइटम्स को उस मान में कैसे परिवर्तित किया जाए जो सीधे हो सकता है तुलना की गई (उदाहरण के लिए एक <कोड> दिनांक समय उदाहरण)।
  5. यह सहयोगी है यदि आप चाहते हैं : यह कोड आइटम को सॉर्ट करने का ख्याल रखता है, लेकिन आप वास्तविक सॉर्ट फ़ंक्शन का चयन करें ( usort या uasort )।
  6. अंत में, यह array_multisort का उपयोग नहीं करता है: जबकि array_multisort सुविधाजनक है, यह सॉर्ट करने से पहले आपके सभी इनपुट डेटा का प्रक्षेपण करने पर निर्भर करता है। यह समय और स्मृति का उपभोग करता है और यदि आपका डेटा सेट बड़ा है तो यह केवल निषिद्ध हो सकता है।

कोड

function make_comparer() {
   //Normalize criteria up front so that the comparer finds everything tidy
    $criteria = func_get_args();
    foreach ($criteria as $index => $criterion) {
        $criteria[$index] = is_array($criterion)
            ? array_pad($criterion, 3, null)
            : array($criterion, SORT_ASC, null);
    }

    return function($first, $second) use (&$criteria) {
        foreach ($criteria as $criterion) {
           //How will we compare this round?
            list($column, $sortOrder, $projection) = $criterion;
            $sortOrder = $sortOrder === SORT_DESC ? -1 : 1;

           //If a projection was defined project the values now
            if ($projection) {
                $lhs = call_user_func($projection, $first[$column]);
                $rhs = call_user_func($projection, $second[$column]);
            }
            else {
                $lhs = $first[$column];
                $rhs = $second[$column];
            }

           //Do the actual comparison; do not return if equal
            if ($lhs < $rhs) {
                return -1 * $sortOrder;
            }
            else if ($lhs > $rhs) {
                return 1 * $sortOrder;
            }
        }

        return 0;//tiebreakers exhausted, so $first == $second
    };
}

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

इस खंड के दौरान मैं इस नमूना डेटा सेट को सॉर्ट करने वाले लिंक प्रदान करूंगा:

$data = array(
    array('zz', 'name' => 'Jack', 'number' => 22, 'birthday' => '12/03/1980'),
    array('xx', 'name' => 'Adam', 'number' => 16, 'birthday' => '01/12/1979'),
    array('aa', 'name' => 'Paul', 'number' => 16, 'birthday' => '03/11/1987'),
    array('cc', 'name' => 'Helen', 'number' => 44, 'birthday' => '24/06/1967'),
);

मूल बातें

फ़ंक्शन make_comparer वांछित क्रम को परिभाषित करने वाले तर्कों की एक चर संख्या को स्वीकार करता है और एक फ़ंक्शन देता है जिसे आप usort या uasort ।

सबसे सरल उपयोग केस उस कुंजी में गुजरना है जिसे आप डेटा आइटम्स की तुलना करने के लिए उपयोग करना चाहते हैं। उदाहरण के लिए, $ आइटम को name आइटम से सॉर्ट करने के लिए आप करेंगे

usort($data, make_comparer('name'));

See it in action.

यदि आइटम संख्यात्मक रूप से अनुक्रमित सरणी हैं तो कुंजी भी एक संख्या हो सकती है। प्रश्न में उदाहरण के लिए, यह होगा

usort($data, make_comparer(0));//0 = first numerically indexed column

See it in action.

एकाधिक प्रकार के कॉलम

You can specify एकाधिक प्रकार के कॉलम by passing additional parameters to make_comparer. For example, to sort by "number" and then by the zero-indexed column:

usort($data, make_comparer('number', 0));

See it in action.

उन्नत सुविधाओं

More उन्नत सुविधाओं are available if you specify a sort column as an array instead of a simple string. This array should be numerically indexed, and must contain these items:

0 => the column name to sort on (mandatory)
1 => either SORT_ASC or SORT_DESC (optional)
2 => a projection function (optional)

चलो देखते हैं कि हम इन सुविधाओं का उपयोग कैसे कर सकते हैं।

रिवर्स सॉर्ट करें

नाम अवरोही द्वारा सॉर्ट करने के लिए:

usort($data, make_comparer(['name', SORT_DESC]));

See it in action.

संख्या अवरोही और फिर नाम से क्रमबद्ध करने के लिए क्रमबद्ध करें:

usort($data, make_comparer(['number', SORT_DESC], ['name', SORT_DESC]));

See it in action.

कस्टम अनुमान

कुछ परिदृश्यों में आपको एक कॉलम द्वारा क्रमबद्ध करने की आवश्यकता हो सकती है जिसका मूल्य सॉर्ट करने के लिए अच्छी तरह से उधार नहीं देता है। नमूना डेटा सेट में "जन्मदिन" कॉलम इस वर्णन को फिट करता है: जन्मदिन की तुलना तारों की तुलना करने के लिए समझ में नहीं आता है (क्योंकि उदा। "01/01/1980" "10/10/1970" से पहले आता है)। इस मामले में हम निर्दिष्ट करना चाहते हैं कि प्रोजेक्ट वास्तविक डेटा को उस फ़ॉर्म पर कैसे करें जिसे कर सकते हैं वांछित अर्थशास्त्र के साथ सीधे तुलना की जा सकती है।

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

यह ध्यान दिया जाना चाहिए कि अनुमान usort और परिवार के साथ उपयोग किए गए कस्टम तुलना कार्यों के समान हैं, लेकिन वे सरल हैं (आपको केवल एक मान को दूसरे में परिवर्तित करने की आवश्यकता है) और पहले से बेक्ड की गई सभी कार्यक्षमताओं का लाभ उठाएं make_comparer में।

आइए प्रोजेक्शन के बिना उदाहरण डेटा सेट को सॉर्ट करें और देखें कि क्या होता है:

usort($data, make_comparer('birthday'));

See it in action.

वह वांछित परिणाम नहीं था। लेकिन हम एक प्रक्षेपण के रूप में date_create का उपयोग कर सकते हैं:

usort($data, make_comparer(['birthday', SORT_ASC, 'date_create']));

See it in action.

यह सही क्रम है जिसे हम चाहते थे।

ऐसी कई और चीजें हैं जिनसे अनुमान प्राप्त हो सकते हैं। उदाहरण के लिए, केस-असंवेदनशील प्रकार प्राप्त करने का एक त्वरित तरीका एक प्रक्षेपण के रूप में strtolower का उपयोग करना है।

उस ने कहा, मुझे यह भी कहना चाहिए कि यदि आपका डेटा सेट बड़ा है तो अनुमानों का उपयोग न करना बेहतर होगा: उस स्थिति में यह आपके सभी डेटा को मैन्युअल रूप से आगे बढ़ाने के लिए बहुत तेज होगा और फिर प्रक्षेपण के बिना सॉर्ट करें, हालांकि ऐसा करने से व्यापार होगा तेजी से क्रम की गति के लिए स्मृति उपयोग में वृद्धि हुई।

अंत में, यहां एक उदाहरण दिया गया है जो सभी सुविधाओं का उपयोग करता है: यह पहली बार संख्या अवरोही से होता है, फिर जन्मदिन आरोही द्वारा:

usort($data, make_comparer(
    ['number', SORT_DESC],
    ['birthday', SORT_ASC, 'date_create']
));

See it in action.

0
जोड़ा
इस साइट पर आसानी से सबसे कम सराहनीय उत्तर।
जोड़ा लेखक jmeas, स्रोत
यह शायद सबसे अच्छा जवाब है जिसे मैंने स्टैक ओवरफ्लो पर देखा है। कोड के सुंदर टुकड़े और अद्भुत दस्तावेज के लिए धन्यवाद !!!
जोड़ा लेखक maddob, स्रोत
@ जोन अद्भुत जवाब के लिए धन्यवाद। हालांकि, मुझे इसका उपयोग करना मुश्किल लगता है। क्या आप कृपया मुझे PHP में डेटा "> stackoverflow.com/questions/36784955/…
जोड़ा लेखक Ironic, स्रोत
@Jon आपकी टिप्पणी के लिए धन्यवाद। हालांकि, मैं अभी भी आपका जवाब पढ़ रहा हूं और इसे समझने की कोशिश कर रहा हूं। यदि आवश्यक हो तो मैं अपने प्रोजेक्ट में इसका उपयोग करूंगा। बस एक शक था। मुझे यकीन नहीं है कि यह मेरे डेटा/सरणी के साथ काम करेगा या नहीं। आपके उदाहरण डेटा में विभिन्न प्रारूप में है।
जोड़ा लेखक Ironic, स्रोत
@ जोन जब मैं आपकी आखिरी कार्रवाई की जांच करता हूं (कॉलबैक date_create के साथ), जन्मदिन गलत क्रम में होता है। क्या आप इस बात की पुष्टि कर सकते है ? मुझे 01/12/1979 , 03/11/1987 , 12/03/1980 और 24/06/1967 । यदि मैं इसके बजाय strtotime का उपयोग करता हूं, तो मुझे एक अच्छा परिणाम मिलता है। मुझे लगता है कि यह डेटटाइम टूट गया है।
जोड़ा लेखक David Bélanger, स्रोत
अरे, @ जोन, मुझे नहीं पता कि मैं आपसे कैसे संपर्क कर सकता हूं लेकिन टिप्पणी के माध्यम से। मैं देखता हूं कि आपने "बहुआयामी सरणी" टैग बनाया है, लेकिन हमें डेटा विज़ुअलाइज़ेशन और संबंधित विषयों में समान अवधि के लिए "बहुआयामी डेटा" भी चाहिए। मैं टैग नहीं बना सकता, क्या मैं आपको एक बनाने के लिए कह सकता हूं, अगर आपको लगता है कि यह समझ में आता है?
जोड़ा लेखक VividD, स्रोत
मैं यहां पार्टी के लिए थोड़ा देर हो चुकी हूं, लेकिन इसके लिए आपको धन्यवाद देना चाहता हूं। बहुत उपयोगी।
जोड़ा लेखक RobertAKARobin, स्रोत
@ दशरथ: मुझे यकीन नहीं है कि आप क्या संरचना बना रहे हैं। यदि आप शीर्ष स्तर से छुटकारा पाने के लिए चाहते हैं, तो या तो $ array ['index'] में जाएं, या फिर प्रक्षेपण function ($ sub) {वापसी $ sub ['index'] का उपयोग करें ; } यदि आप अनुक्रमणिका नामक मध्य-स्तर आयाम से छुटकारा पाना चाहते हैं।
जोड़ा लेखक Jon, स्रोत
@CalculatingMachine मैंने सवाल पढ़ा, लेकिन आप यह नहीं दिखाते कि आपने क्या करने की कोशिश की है। ऐसा लगता है कि बस usort ($ data ['content'], get_comparer ('price')) पर्याप्त होगा, लेकिन मुझे यकीन नहीं है।
जोड़ा लेखक Jon, स्रोत
@VividD: मैंने स्वयं टैग नहीं बनाया है, और टैग सृजन स्वयं ही नहीं हो सकता है। नए टैग पूरी तरह से बनाए जाते हैं जब आवश्यक विशेषाधिकार वाले किसी व्यक्ति को प्रश्न लिखने के लिए उनका उपयोग किया जाता है; यह देखते हुए कि मैंने कभी नहीं देखा है और शायद कभी ऐसा कोई प्रश्न नहीं दिखेगा जो मुझे लगता है कि इस तरह टैग किया जाना चाहिए, मैं वास्तव में मदद नहीं कर सकता।
जोड़ा लेखक Jon, स्रोत
@YahyaE: वस्तुओं के सरणी छंटनी? $ पहले [$ कॉलम] को $ पहले -> $ कॉलम के साथ बदलें, और $ second के लिए। कुल में चार प्रतिस्थापन।
जोड़ा लेखक Jon, स्रोत
@ एक्रोपोलिस: PHP 5.3 छोटे [...] सरणी वाक्यविन्यास का समर्थन नहीं करता है, आपको इसके बजाय array (...) का उपयोग करना होगा। मैंने अतिरिक्त ब्रेवटी के उदाहरणों में ऐसा नहीं किया, लेकिन make_comparer स्वयं 5.3 के साथ संगत है।
जोड़ा लेखक Jon, स्रोत
@ एक्रोपोलिस: आपके पास फ़ंक्शन ($ टी) के आस-पास अतिरिक्त उद्धरण हैं ... जिन्हें निकालने की आवश्यकता है। चीयर्स!
जोड़ा लेखक Jon, स्रोत
@Ecropolis: ठीक है, तो आप एक सरणी बना सकते हैं जहां कुंजी फ़ाइल प्रकार और मान हैं "वजन" (छोटे वजन = आइटम शीर्ष पर चला जाता है) $ weights = array_flip ($ sort_array) के साथ। $ weights अब ['mp4' => 0, 'mpeg' => 1, ...] है। इसके बाद आप तुलनात्मक रूप से फ़ाइल प्रकार पर सॉर्ट करके इसका उपयोग कर सकते हैं और इसे प्रक्षेपण के रूप में उपयोग कर सकते हैं: function ($ t) उपयोग ($ भार) {$ $ भार [$ टी]; })
जोड़ा लेखक Jon, स्रोत
@ एंड्रयू: उदाहरण । लेकिन याद रखें कि यह अक्षम है इसलिए यदि आपका डेटा सेट छोटा नहीं है तो ऐसा न करें।
जोड़ा लेखक Jon, स्रोत
@ एक्रोपोलिस: कृपया अपने इनपुट (ओं) और वांछित आउटपुट का एक अच्छा उदाहरण पोस्ट करें (उदा। Ideone.com या pastebin.com) ताकि हम गलतफहमी को खत्म कर सकें।
जोड़ा लेखक Jon, स्रोत
@ डेविड ब्लेंजर: कौन सा यूआरएल बिल्कुल? सभी उदाहरण ideone.com और मेरी स्थानीय मशीन पर दोनों सही तरीके से काम करते हैं।
जोड़ा लेखक Jon, स्रोत
@ जोन धन्यवाद, मैंने अभी कोशिश की है और इसके बिना 0.006 सेकेंड धीमी है, 200 पंक्तियों को सॉर्ट करें। मुझे लगता है कि मैं इस तरह की अक्षमता स्वीकार करूंगा :)
जोड़ा लेखक Andrew, स्रोत
क्या आप उदाहरण दे सकते हैं कि केस-असंवेदनशील प्रकार को कैसे कार्यान्वित किया जाए? मैंने प्रक्षेपण को लोअरकेस में बदलने की कोशिश की लेकिन यह काम नहीं करेगा ...
जोड़ा लेखक Andrew, स्रोत
@ जोन - यहां आपको टिप्पणियों के साथ उदाहरण सरणी हैं। ideone.com/utbrNt
जोड़ा लेखक Ecropolis, स्रोत
मेरे पास मूल्यों की एक और सरणी है जिसे मैं कॉलम को सॉर्ट करना चाहता हूं और कॉलम में मान एकाधिक मिलान हो सकता है। सॉर्ट सरणी फ़ाइल प्रकारों का है इसलिए मैं हमेशा एक विशिष्ट क्रम में दिखाने के लिए फ़ाइलों की एक सूची के फाइल प्रकार चाहता हूं। क्या यह इस निर्माण में संभव है?
जोड़ा लेखक Ecropolis, स्रोत
अति उत्कृष्ट! धन्यवाद @ जोन। मैंने इस फ़ंक्शन का उपयोग करने के लिए किसी अन्य का उपयोग करके सरणी को सॉर्ट करने के लिए पूर्ण उदाहरण के लिए ideone.com/utbrNt अपडेट किया है संदर्भ क्रम मूल्य।
जोड़ा लेखक Ecropolis, स्रोत
@ जोन - आपकी सभी मदद के लिए धन्यवाद। मैंने इसे अपने सर्वर पर लागू करने की कोशिश की और मुझे यह मिलता है: PHP पार्स त्रुटि: वाक्यविन्यास त्रुटि, अप्रत्याशित '[', उम्मीद ') - मैंने अलग-अलग बदलाव की कोशिश की, मैं वास्तव में यह कैसे काम करता हूं इस पर थोड़ा सा खो गया हूं। मैं v5.3.28 पर हूं - ideone.com PHP 5.4 चलाता है - क्या यह मुद्दा है?
जोड़ा लेखक Ecropolis, स्रोत
मेरा एक 4 डी सरणी है? यदि संभव हो तो मैं इंडेक्स कैसे पास कर सकता हूं?
जोड़ा लेखक Dashrath, स्रोत
@ जोन ग्रेट उत्तर और मैं मानता हूं कि यह उत्तर के बजाय एक वेब साइट की तरह है। धन्यवाद। केवल एक सवाल है। मैं वस्तुओं के लिए चलाने के लिए इसे कैसे काम कर सकता हूं?
जोड़ा लेखक YahyaE, स्रोत

The "Usort" function is your answer.
http://php.net/usort

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

You can use array_multisort()

इस तरह कुछ कोशिश करें:

foreach ($mdarray as $key => $row) {
   //replace 0 with the field's index/key
    $dates[$key]  = $row[0];
}

array_multisort($dates, SORT_DESC, $mdarray);

For PHP >= 5.5.0 just extract the column to sort by. No need for the loop:

array_multisort(array_column($mdarray, 0), SORT_DESC, $mdarray);
0
जोड़ा
तो इस उदाहरण में, $ mdarray डेटाबेस रिकॉर्ड की सरणी की तरह एक द्वि-आयामी सरणी हो सकती है। इस उदाहरण में, 0 प्रत्येक रिकॉर्ड (या पंक्ति) में 'दिनांक' कॉलम का सूचकांक है। तो आप $ तिथियां सरणी (मूल रूप से एक ही सरणी बनाते हैं, लेकिन केवल उस कॉलम के साथ) का निर्माण करते हैं, और उस विशेष कॉलम के मानों के आधार पर $ mdarray को सॉर्ट करने के लिए array_multisort फ़ंक्शन को बताएं।
जोड़ा लेखक Dan Burton, स्रोत
स्पष्टता के लिए, आप इस उदाहरण की शुरुआत में जोड़ सकते हैं $ तिथियां = सरणी ();
जोड़ा लेखक Dan Burton, स्रोत
मुझे लगता है कि यह मुझे दिखाता है कि मुझे पहले काम करने के लिए array_multisort क्यों नहीं मिला।
जोड़ा लेखक Melikoth, स्रोत
Array_multisort सहयोगी सरणी के साथ काम करना चाहिए ( $ पंक्ति [0] को $ पंक्ति ['जो भी'] में बदलना चाहिए? कोई नहीं यहां। मेरे सरणी को संख्यात्मक में बदलने के बाद फ़ंक्शन काम करता है जैसा सोचा था।
जोड़ा लेखक a coder, स्रोत
PHP array_multisort पृष्ठ पर अब इस उत्तर का एक और व्यापक उदाहरण है: php.net/manual/en/function.array-multisort.php#example-4928
जोड़ा लेखक icc97, स्रोत
चेतावनी: array_multisort (): ऐरे आकार असंगत हैं
जोड़ा लेखक RaviPatidar, स्रोत
array_multisort() जिस तरह से मैंने इसे हमेशा किया है, हालांकि यह आपके सिर को लपेटने में थोड़ा मुश्किल हो सकता है कि यह पहले कैसे काम करता है।
जोड़ा लेखक Garrett Albright, स्रोत
यदि array_multi_sort() उत्तर है, तो प्रश्न समझा नहीं गया था। तकनीकी रूप से यह काम करेगा, आमतौर पर उपयोगकर्ता द्वारा उत्पन्न तुलना फ़ंक्शन और usort() फ़ंक्शन के उपयोग के साथ बेहतर समाधान होता है। इसे बनाए रखना आसान है। बहुआयामी के साथ, आप आमतौर पर कोड बनाते हैं जो सॉर्टिंग के लिए डेटा तैयार करता है। यदि डेटा संरचना बदलती है, तो उस कोड को फेंक दिया जा सकता है। Usort() के साथ, आप तुलना फ़ंक्शन को बदलते हैं - वैसे ही आपने डेटा संरचना बदल दी है।
जोड़ा लेखक Sven, स्रोत
इस जवाब ने वास्तव में मेरी वर्तमान परियोजना में धन्यवाद, धन्यवाद!
जोड़ा लेखक Stephen, स्रोत
array_multisort() का उपयोग करते समय $ key अनावश्यक शामिल नहीं है? यह foreach ($ mdarray $ पंक्ति के रूप में) लिखने के लिए सरल और अधिक जानबूझकर लगता है {$ sortByDate [] = $ पंक्ति ['date']; } फिर array_multisort ($ sortByDate, SORT_DESC, $ mdarray); (आपका अर्थात् माइलेज मेरा भिन्नता है)।
जोड़ा लेखक Mark Fox, स्रोत
किसी अज्ञात कारण के लिए usort ने मेरे लिए काम नहीं किया है। यह करता है
जोड़ा लेखक cameronjonesweb, स्रोत
शानदार जवाब। यह मेरे लिए काफी अच्छा काम करता है,
जोड़ा लेखक Raul A., स्रोत

मैं array_multisort का उपयोग करना पसंद करता हूं। दस्तावेज देखें यहां

0
जोड़ा

यहां एक php4/php5 क्लास है जो एक या अधिक फ़ील्ड को सॉर्ट करेगी:

// a sorter class
//  php4 and php5 compatible
class Sorter {

  var $sort_fields;
  var $backwards = false;
  var $numeric = false;

  function sort() {
    $args = func_get_args();
    $array = $args[0];
    if (!$array) return array();
    $this->sort_fields = array_slice($args, 1);
    if (!$this->sort_fields) return $array();

    if ($this->numeric) {
      usort($array, array($this, 'numericCompare'));
    } else {
      usort($array, array($this, 'stringCompare'));
    }
    return $array;
  }

  function numericCompare($a, $b) {
    foreach($this->sort_fields as $sort_field) {
      if ($a[$sort_field] == $b[$sort_field]) {
        continue;
      }
      return ($a[$sort_field] < $b[$sort_field]) ? ($this->backwards ? 1 : -1) : ($this->backwards ? -1 : 1);
    }
    return 0;
  }

  function stringCompare($a, $b) {
    foreach($this->sort_fields as $sort_field) {
      $cmp_result = strcasecmp($a[$sort_field], $b[$sort_field]);
      if ($cmp_result == 0) continue;

      return ($this->backwards ? -$cmp_result : $cmp_result);
    }
    return 0;
  }
}

/////////////////////
// usage examples

// some starting data
$start_data = array(
  array('first_name' => 'John', 'last_name' => 'Smith', 'age' => 10),
  array('first_name' => 'Joe', 'last_name' => 'Smith', 'age' => 11),
  array('first_name' => 'Jake', 'last_name' => 'Xample', 'age' => 9),
);

// sort by last_name, then first_name
$sorter = new Sorter();
print_r($sorter->sort($start_data, 'last_name', 'first_name'));

// sort by first_name, then last_name
$sorter = new Sorter();
print_r($sorter->sort($start_data, 'first_name', 'last_name'));

// sort by last_name, then first_name (backwards)
$sorter = new Sorter();
$sorter->backwards = true;
print_r($sorter->sort($start_data, 'last_name', 'first_name'));

// sort numerically by age
$sorter = new Sorter();
$sorter->numeric = true;
print_r($sorter->sort($start_data, 'age'));
0
जोड़ा
क्या यह केवल सहयोगी सरणी के साथ काम करता है?
जोड़ा लेखक Melikoth, स्रोत
हाँ - केवल सहयोगी सरणी। अब जब मैं इसे देखता हूं, तो यह इस समस्या का सही समाधान नहीं है।
जोड़ा लेखक Devon, स्रोत

मुझे पता है कि यह सवाल पूछा गया है और उत्तर दिया गया है, लेकिन यहां एक और कार्य है जो एक द्वि-आयामी सरणी टाइप करता है। यह तर्कों की एक चर संख्या को स्वीकार करता है, जिससे आप एक से अधिक कुंजी (यानी कॉलम नाम) को क्रमबद्ध करने की अनुमति देते हैं। PHP 5.3 आवश्यक है।

function sort_multi_array ($array, $key)
{
  $keys = array();
  for ($i=1;$i

Try it here: http://www.exorithm.com/algorithm/view/sort_multi_array

0
जोड़ा
हां, मेरा ऐसा मानना ​​है
जोड़ा लेखक Mike C, स्रोत

मैंने कई लोकप्रिय array_multisort() और usort() उत्तरों की कोशिश की और उनमें से कोई भी मेरे लिए काम नहीं किया। डेटा सिर्फ जुड़ा हुआ हो जाता है और कोड अपठनीय है। यहां एक त्वरित गंदा समाधान है। चेतावनी: अगर आप सुनिश्चित हैं कि एक बदमाश डिलीमीटर बाद में आपको पीछे हटने के लिए वापस नहीं आएगा तो केवल इसका इस्तेमाल करें!

आइए मान लें कि आपकी बहु सरणी में प्रत्येक पंक्ति इस तरह दिखती है: नाम, stuff1, stuff2:

// Sort by name, pull the other stuff along for the ride
foreach ($names_stuff as $name_stuff) {
   //To sort by stuff1, that would be first in the contatenation
    $sorted_names[] = $name_stuff[0] .','. name_stuff[1] .','. $name_stuff[2];
}
sort($sorted_names, SORT_STRING);

वर्णमाला क्रम में वापस अपनी सामग्री की आवश्यकता है?

foreach ($sorted_names as $sorted_name) {
    $name_stuff = explode(',',$sorted_name);
   //use your $name_stuff[0] 
   //use your $name_stuff[1] 
   //... 
}

हाँ, यह गंदा है। लेकिन सुपर आसान, आपके सिर विस्फोट नहीं करेगा।

0
जोड़ा
function cmp($a, $b)
{
$p1 = $a['price'];
$p2 = $b['price'];
return (float)$p1 > (float)$p2;
}
uasort($my_array, "cmp");

http://qaify.com/sort-an-array-of-associative-arrays-by-value-of-given-key-in-php/

0
जोड़ा