PHP order array by date?

137,184

Solution 1

You don't need to convert your dates to timestamps before the sorting, but it's a good idea though because it will take more time to sort without this step.

$data = array(
    array(
        "title" => "Another title",
        "date"  => "Fri, 17 Jun 2011 08:55:57 +0200"
    ),
    array(
        "title" => "My title",
        "date"  => "Mon, 16 Jun 2010 06:55:57 +0200"
    )
);

function sortFunction( $a, $b ) {
    return strtotime($a["date"]) - strtotime($b["date"]);
}
usort($data, "sortFunction");
var_dump($data);

Update

In newer PHP versions you can use arrow functions too. Here you can find a more concise version of the above:

usort($data, fn ($a, $b) => strtotime($a["date"]) - strtotime($b["date"]));

Solution 2

Use usort:

usort($array, function($a1, $a2) {
   $v1 = strtotime($a1['date']);
   $v2 = strtotime($a2['date']);
   return $v1 - $v2; // $v2 - $v1 to reverse direction
});

Solution 3

I recommend using DateTime objects instead of strings, because you cannot easily compare strings, which is required for sorting. You also get additional advantages for working with dates.

Once you have the DateTime objects, sorting is quite easy:

usort($array, function($a, $b) {
  return ($a['date'] < $b['date']) ? -1 : 1;
});
Share:
137,184

Related videos on Youtube

Jens Törnell
Author by

Jens Törnell

Updated on September 22, 2021

Comments

  • Jens Törnell
    Jens Törnell over 2 years

    Possible Duplicate:
    PHP Sort a multidimensional array by element containing date

    I have some data from XML or JSON in a PHP array that looks like this:

    [0]= array(2) {
        ["title"]= string(38) "Another title"
        ["date"]= string(31) "Fri, 17 Jun 2011 08:55:57 +0200"
    }
    [1]= array(2) {
        ["title"]= string(38) "My title"
        ["date"]= string(31) "Mon, 16 Jun 2010 06:55:57 +0200"
    }
    

    What I want to do is order the two items by date.

    1. Is it possible to sort by date, when the sort value is inside every item?
    2. Do I need to convert the date format to timestamp?

    What I don't want to do

    I could use date and set it as the ID but that don't feel right, because two items can have the same date and then it would not be unique.

    • Sander
      Sander almost 13 years
      Take a look at the first answer in this post: link
  • kray
    kray about 7 years
    Very direct, clean answer. Thank you.
  • Mojo Allmighty
    Mojo Allmighty about 7 years
    Clean answer but this will lose values if two dates are equal
  • KARASZI István
    KARASZI István about 7 years
    That is not true, why would it? They would simply right after each other.
  • Guchelkaben
    Guchelkaben over 6 years
    What about this version? usort($sortArray, function ($a, $b) { return strcmp($a['article_created_date'], $b['article_created_date']); });