পিএইচপি তারিখযুক্ত উপাদান অনুসারে একটি বহুমাত্রিক অ্যারে বাছাই করুন


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অ্যারের মধ্যে রাখা হবে $array। নিশ্চিত হয়ে নিন যে আপনি ফাংশনটির নামটি ভুল বানান করেন নি।
ফার্ডিনান্দ বায়ার

আমি নিশ্চিত নই যে আমি বুঝেছি. আমার উদাহরণে, অ্যারেতে আমার 3 টি অ্যারে রয়েছে - আমি নামটি নিশ্চিত করেছি, এখনও অবৈধ তুলনা ফাংশন পেয়েছি
টিম

আমি যুক্ত করা ব্যাখ্যা দেখুন। আমি কোডটি পরীক্ষা করেছি এবং এটি আমার পক্ষে ভাল কাজ করে!
ফার্ডিনান্দ বায়ার

9
আমি কোডআইগনিটার জানি না, তবে আপনি কি কোনও ক্লাসের ভিতরে ফাংশনটি সংজ্ঞায়িত করছেন? ক্লাসের বাইরে আপনাকে এটি সংজ্ঞায়িত করতে হবে বা আলাদা কলব্যাক আর্গুমেন্ট ব্যবহার করতে হবে: usort($array, array($this, "date_compare"))যাতে এটি usort()জানে যে এটি একটি শ্রেণিকর্ম / পদ্ধতি। আরও দেখুন: php.net/manual/en/…
ফার্ডিনান্ড বায়ার

45

এই কাজ করা উচিত. আমি স্ট্রোটোটাইমের মাধ্যমে তারিখটিকে ইউনিক্সে রূপান্তর করেছি।

  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);

এটি দুর্দান্ত কাজ করে। কেবল প্রতিস্থাপন করুন: আপনার বহুমাত্রিক অ্যারের নামের সাথে $ অরিজিনালআরে। এবং প্রতিস্থাপন করুন: তারিখের জন্য আপনার সাব-অ্যারে ক্ষেত্রের নামের সাথে 'ডেটটাইম'। ধন্যবাদ।

1
এই সমাধানটি আমার পক্ষে ভাল করছে। বাছাই বিকল্পটি দুর্দান্ত (SORT_ASC বা SORT_DESC)। অনেক ধন্যবাদ.
আন্দ্রেস বার্থ

একটি ছোট ক্যাভিয়েটের সাথে সুন্দরভাবে কাজ করে (তা হয় বা আমি কিছু ভুল করছি) ... আমার যে তারিখের ক্ষেত্রটি বাছাই করতে হবে তার ডিডি / মিমি / ইয়াই বা ইয়িআই / মিমি / ডিডি (স্ল্যাশ সহ) ফর্ম্যাটে তারিখ রয়েছে। সেক্ষেত্রে, বাছাই কোনও কারণে কাজ করে নি (কেবল দিন দ্বারা সাজানো, পুরো তারিখ নয়) not আমি তাদের তারিখগুলি প্রাক-প্রক্রিয়াজাতকরণের তারিখগুলি ডিডি-মিমি-ইয়িআই বা ইয়িআই-মিমি-ডিডি রূপান্তর করতে প্রস্তুত করেছি এবং এটি এত ধন্যবাদ! (কেন এটি
হাইফেনগুলির

অ্যারে_মল্টিসর্ট হ'ল একমাত্র বাছাই পদ্ধতি যা আমার জসন ফাইলটিকে পাবডেট অনুসারে বাছাই করতে কাজ করেছিল। ধন্যবাদ।
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);

?>

fyi, একটি ইউনিক্স (1970 থেকে সেকেন্ড) বা মাইএসকিএল টাইমস্ট্যাম্প (YmdHis - 20100526014500) পার্সারের পক্ষে সহজ হবে তবে আমি মনে করি আপনার ক্ষেত্রে এটি কোনও পার্থক্য রাখে না।


5

নির্দিষ্ট mysql ডেটটাইম ক্ষেত্র এবং আদেশ অনুসারে রেকর্ডস / এসোসিয়েশনগুলি অ্যারে বাছাই করা:

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

কলরব্যাক ফাংশন সহ ইউর্ট () ব্যবহার করে আপনি কেবল এই সমস্যার সমাধান করতে পারেন । কোনও কাস্টম ফাংশন লেখার দরকার নেই।

$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

আমি এই পোস্টে এসে পৌঁছেছি কিন্তু আমার ক্লাসের আইটেমগুলি ফেরত দেওয়ার সময় আমি সময় অনুসারে বাছাই করতে চেয়েছিলাম এবং আমি একটি ত্রুটি পেয়েছি।

তাই আমি পিএইচপিএন.কম ওয়েবসাইটটি গবেষণা করি এবং এটি শেষ করে:

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

আপনি পিএইচপি . 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;

    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.