PHP तत्व युक्त तारीख से एक बहुआयामी सरणी को क्रमबद्ध करता है


113

मेरे पास एक सरणी है जैसे:

Array
(
[0] => Array
    (
        [id] => 2
        [type] => comment
        [text] => hey
        [datetime] => 2010-05-15 11:29:45
    )

[1] => Array
    (
        [id] => 3
        [type] => status
        [text] => oi
        [datetime] => 2010-05-26 15:59:53
    )

[2] => Array
    (
        [id] => 4
        [type] => status
        [text] => yeww
        [datetime] => 2010-05-26 16:04:24
    )

)

क्या कोई इसे डेटाइम तत्व के आधार पर सॉर्ट / ऑर्डर करने का तरीका सुझा सकता है?

जवाबों:


206

usort()एक कस्टम तुलना फ़ंक्शन का उपयोग करें :

function date_compare($a, $b)
{
    $t1 = strtotime($a['datetime']);
    $t2 = strtotime($b['datetime']);
    return $t1 - $t2;
}    
usort($array, 'date_compare');

संपादित करें : आपका डेटा सारणियों की एक सरणी में व्यवस्थित है। उन लोगों को बेहतर ढंग से अलग करने के लिए, आइए इनर एरे (डेटा) रिकॉर्ड को कॉल करें, ताकि आपका डेटा वास्तव में रिकॉर्ड का एक सरणी हो।

usortदिए गए तुलनात्मक फंक्शन date_compare()में इनमें से दो रिकॉर्ड पास करेंगे । date_compareफिर "datetime"प्रत्येक रिकॉर्ड के क्षेत्र को UNIX टाइमस्टैम्प (एक पूर्णांक) के रूप में निकालता है , और अंतर को लौटाता है, ताकि परिणाम 0दोनों तिथियों के बराबर होने पर, एक सकारात्मक संख्या पहले एक ( $a) बड़ा या एक नकारात्मक मान हो तो दूसरा तर्क ( $b) बड़ा है। usort()सरणी को सॉर्ट करने के लिए इस जानकारी का उपयोग करता है।


1
इस उदाहरण में, क्या $ सरणी को तत्वों को $ a और $ b समाहित करने की आवश्यकता है? - im एक त्रुटि अमान्य फ़ंक्शन की तुलना कर रहा है
टिम

नहीं, $aऔर $bभीतर सरणियाँ आयोजित करेगा $array। सुनिश्चित करें कि आपने फ़ंक्शन का नाम नहीं छोड़ा है।
फर्डिनेंड बेयर

मुझे यकीन नहीं कि मैं समझा हूँ। मेरे उदाहरण में, मेरे पास सरणी में 3 सरणियाँ हैं - मैंने नाम की पुष्टि की है, अभी भी अमान्य तुलना फ़ंक्शन प्राप्त कर रहा है
टिम

मैंने जो स्पष्टीकरण दिया, उसे देखें। मैंने कोड का परीक्षण किया और यह मेरे लिए ठीक काम करता है!
फर्डिनेंड बायर

9
मुझे पता नहीं है CodeIgniter, लेकिन क्या आप एक वर्ग के अंदर फ़ंक्शन को परिभाषित कर रहे हैं? आपको या तो इसे कक्षा के बाहर परिभाषित करना होगा या एक अलग कॉलबैक तर्क का उपयोग करना होगा: usort($array, array($this, "date_compare"))ताकि यह usort()पता चले कि यह एक क्लास फ़ंक्शन / विधि है। इसे भी देखें: php.net/manual/en/…
फर्डिनेंड बेयर

45

यह काम करना चाहिए। मैंने strtotime के माध्यम से तारीख को यूनिक्स समय में बदल दिया।

  foreach ($originalArray as $key => $part) {
       $sort[$key] = strtotime($part['datetime']);
  }
  array_multisort($sort, SORT_DESC, $originalArray);

एक-लाइनर संस्करण कई सरणी विधियों का उपयोग करेगा:

array_multisort(array_map('strtotime',array_column($originalArray,'datetime')),
                SORT_DESC, 
                $originalArray);

यह बहुत अच्छा काम करता है। बस प्रतिस्थापित करें: अपने मूल-आयामी सरणी के नाम के साथ $ $ मूल। और बदलें: तिथि के लिए अपने उप-सरणी फ़ील्ड के नाम के साथ 'डेटाइम'। धन्यवाद।
washere

1
यह समाधान मेरे लिए अच्छा है। सॉर्ट विकल्प बहुत अच्छा है (SORT_ASC या SORT_DESC)। बहुत बहुत धन्यवाद।
आंद्रा बर्थ

एक छोटे से कैविएट के साथ खूबसूरती से काम करता है (या तो वह है, या मैं कुछ गलत कर रहा हूं) ... मुझे जिस दिनांक फ़ील्ड को क्रमबद्ध करना है, उसमें प्रारूप dd / mm / yyyy या yyyy / mm / dd (स्लैश के साथ) हैं। उस मामले में, छंटाई किसी कारण से काम नहीं करती थी (केवल दिन के आधार पर छंटनी की जाती है, संपूर्ण तिथि नहीं)। मैंने उन्हें dd-mm-yyyy या yyyy-mm-dd में बदलने के लिए पूर्व-संसाधित तिथियां दीं और इसने बहुत धन्यवाद काम किया !!! (कोई विचार क्यों यह हाइफ़न के साथ काम करता है लेकिन स्लैश नहीं करता है?)
जेवियर लारूलेट

array_multisort एकमात्र प्रकार का तरीका है, जिसने pubdate द्वारा मेरी json फाइल को सॉर्ट करने का काम किया है। धन्यवाद।
GRC

मेरे लिए वास्तव में अच्छी तरह से काम करना, धन्यवाद
फर्नांडो टॉरेस


6

http://us2.php.net/manual/en/function.array-multisort.php तीसरा उदाहरण देखें:

<?php

$data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);

foreach ($data as $key => $row) {
    $volume[$key]  = $row['volume'];
    $edition[$key] = $row['edition'];
}

array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);

?>

फी, एक यूनिक्स (1970 से सेकंड) या mysql टाइमस्टैम्प (YmdHis - 20100526014500) का उपयोग करना पार्सर के लिए आसान होगा, लेकिन मुझे लगता है कि आपके मामले में इससे कोई फर्क नहीं पड़ता।


5

निर्दिष्ट mysql डेटाटाइम फ़ील्ड द्वारा और क्रम से अभिलेख / assoc_arrays के क्रमबद्ध सरणी:

function build_sorter($key, $dir='ASC') {
    return function ($a, $b) use ($key, $dir) {
        $t1 = strtotime(is_array($a) ? $a[$key] : $a->$key);
        $t2 = strtotime(is_array($b) ? $b[$key] : $b->$key);
        if ($t1 == $t2) return 0;
        return (strtoupper($dir) == 'ASC' ? ($t1 < $t2) : ($t1 > $t2)) ? -1 : 1;
    };
}


// $sort - key or property name 
// $dir - ASC/DESC sort order or empty
usort($arr, build_sorter($sort, $dir));

पूरी तरह से मुझे क्या चाहिए। लेकिन बदलना str_to_upperहोगा strtoupper
जिमी एडारो

4

$array = Array
(
  [0] => Array
   (
    [id] => 2
    [type] => comment
    [text] => hey
    [datetime] => 2010-05-15 11:29:45
   )

 [1] => Array
  (
    [id] => 3
    [type] => status
    [text] => oi
    [datetime] => 2010-05-26 15:59:53
  )

  [2] => Array
   (
    [id] => 4
    [type] => status
    [text] => yeww
    [datetime] => 2010-05-26 16:04:24
   )

   );
   print_r($array);   
   $name = 'datetime';
   usort($array, function ($a, $b) use(&$name){
      return $a[$name] - $b[$name];});

   print_r($array);

4

आप बस कॉलबैक फ़ंक्शन के साथ usort () का उपयोग करके इस समस्या को हल कर सकते हैं । कोई कस्टम फ़ंक्शन लिखने की आवश्यकता नहीं है।

$your_date_field_name = 'datetime';
usort($your_given_array_name, function ($a, $b) use (&$your_date_field_name) {
    return strtotime($a[$your_date_field_name]) - strtotime($b[$your_date_field_name]);
});

1

मैं इस पोस्ट पर आया था लेकिन मैं अपनी कक्षा के अंदर आइटम वापस करते समय समय के अनुसार क्रमबद्ध करना चाहता था और मुझे एक त्रुटि मिली।

इसलिए मैं php.net वेबसाइट पर शोध करता हूं और इसे समाप्त करता हूं:

class MyClass {
   public function getItems(){
      usort( $this->items, array("MyClass", "sortByTime") );
      return $this->items;
   }
   public function sortByTime($a, $b){
      return $b["time"] - $a["time"];
   }
}

आप PHP.net वेबसाइट में बहुत उपयोगी उदाहरण पा सकते हैं

मेरी सरणी इस तरह दिखी:

  'recent' => 
    array
      92 => 
        array
          'id' => string '92' (length=2)
          'quantity' => string '1' (length=1)
          'time' => string '1396514041' (length=10)
      52 => 
        array
          'id' => string '52' (length=2)
          'quantity' => string '8' (length=1)
          'time' => string '1396514838' (length=10)
      22 => 
        array
          'id' => string '22' (length=2)
          'quantity' => string '1' (length=1)
          'time' => string '1396514871' (length=10)
      81 => 
        array
          'id' => string '81' (length=2)
          'quantity' => string '2' (length=1)
          'time' => string '1396514988' (length=10)

1

के लिए 'd/m/Y'दिनांक:

usort($array, function ($a, $b, $i = 'datetime') { 
    $t1 = strtotime(str_replace('/', '-', $a[$i]));
    $t2 = strtotime(str_replace('/', '-', $b[$i]));

    return $t1 > $t2;
});

$iसरणी सूचकांक कहां है


1

उन लोगों के लिए जो अभी भी इसे हल कर रहे हैं एक वर्ग के अंदर इस तरह से एक फ़ंक्शन सॉर्टबेट के साथ, नीचे दिए गए कोड को देखें

<?php

class ContactsController 
{
    public function __construct()
    {
    //
    }


    function sortByDate($key)
    {
        return function ($a, $b) use ($key) {
            $t1 = strtotime($a[$key]);
            $t2 = strtotime($b[$key]);
            return $t2-$t1;
        };

    }

    public function index()
    {

        $data[] = array('contact' => '434343434', 'name' => 'dickson','updated_at' =>'2020-06-11 12:38:23','created_at' =>'2020-06-11 12:38:23');
        $data[] = array('contact' => '434343434', 'name' => 'dickson','updated_at' =>'2020-06-16 12:38:23','created_at' =>'2020-06-10 12:38:23');
        $data[] = array('contact' => '434343434', 'name' => 'dickson','updated_at' =>'2020-06-7 12:38:23','created_at' =>'2020-06-9 12:38:23');


        usort($data, $this->sortByDate('updated_at'));

        //usort($data, $this->sortByDate('created_at'));
        echo $data;

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