1

hello I want to sort my object array by date, which is like that:

$array = array( 
[0] = array ('date' => '2012-05-15', 'name' => 'jon')
[1] = array ('date' => '2012-05-10', 'name' => 'jon')
[2] = array ('date' => '2012-05-09', 'name' => 'jon')
[3] = array ('date' => '2012-05-16', 'name' => 'jon')
);

can I do that somehow? and what method I have to use? Thanks.

Donatas Veikutis
  • 974
  • 2
  • 15
  • 36
  • Where do you get the data from? If you pull the data out of a database, you could edit the SQL query. – Ahatius Apr 25 '12 at 05:18
  • possible duplicate of [How to sort a multidimensional array by a certain key?](http://stackoverflow.com/questions/2804690/how-to-sort-a-multidimensional-array-by-a-certain-key) – deceze Apr 25 '12 at 05:19
  • you cold edit the sql query, order by date :) so the result data will be order by date, it depends on you if you want ascending or descending http://www.1keydata.com/sql/sqlorderby.html – SuperNoob Apr 25 '12 at 05:25
  • yes I get this from database, but for my reasons I cant do sorting in database :) – Donatas Veikutis Apr 25 '12 at 05:25

4 Answers4

2

You could use usort() with some custom logic to accomplish this:

$array = array(
    array('date' => '2012-05-15', 'name' => 'jon'),
    array('date' => '2012-05-10', 'name' => 'jon'),
    array('date' => '2012-05-09', 'name' => 'jon'),
    array('date' => '2012-05-16', 'name' => 'jon')
);

function mySorter( $a, $b ) {
  if ( $a['date'] < $b['date'] ) return -1;
  if ( $a['date'] > $b['date'] ) return 1;
  return 0;
}

usort( $array, mySorter );

When all is said and done, $array now looks like this:

Array
(
    [0] => Array
        (
            [date] => 2012-05-09
            [name] => jon
        )
    [1] => Array
        (
            [date] => 2012-05-10
            [name] => jon
        )
    [2] => Array
        (
            [date] => 2012-05-15
            [name] => jon
        )
    [3] => Array
        (
            [date] => 2012-05-16
            [name] => jon
        )
)
Sampson
  • 265,109
  • 74
  • 539
  • 565
1

uasort() is another option.

$array = array( 
array ('date' => '2012-05-15', 'name' => 'jon'),
array ('date' => '2012-05-10', 'name' => 'jon'),
array ('date' => '2012-05-09', 'name' => 'jon'),
array ('date' => '2012-05-16', 'name' => 'jon')
);

function date_sort($a, $b)
{
    if ( $a['date'] < $b['date'] ) return -1;
    if ( $a['date'] > $b['date'] ) return 1;
    return 0;
}

uasort($array, 'date_sort');
var_dump($array);
Jack
  • 5,680
  • 10
  • 49
  • 74
1

Obviously, usort is the answer. But, if you want to specify the sorting criterion (sort by date or sort by name), you can do the following:

<?php
$sortOrder = 'date'; // default is to sort by date
$array = array( 
[0] = array ('date' => '2012-05-15', 'name' => 'jon')
[1] = array ('date' => '2012-05-10', 'name' => 'jon')
[2] = array ('date' => '2012-05-09', 'name' => 'jon')
[3] = array ('date' => '2012-05-16', 'name' => 'jon')
);

function date_sort($a, $b)
{
    global $sortOrder;

    if( $sortOrder == 'date' ) {
        if ( strtotime( $a['date'] ) < strtotime( $b['date'] ) ) return -1;
        if ( strtotime( $a['date'] ) > strtotime( $b['date'] ) ) return 1;
        return 0;
    } else if( $sortOrder == 'name' ) {
        return strcmp( $a['name'], $b['name'] );
    }
}

// sorted by date
uasort($array, 'mysort');


// sorted by name
$sortOrder = 'name';
uasort($array, 'mysort');
?>

Hope this helps.

web-nomad
  • 6,003
  • 3
  • 34
  • 49
0
$array = array(
array ('date' => '2012-05-15', 'name' => 'jon'), 
array ('date' => '2012-05-10', 'name' => 'jon'),
array ('date' => '2012-05-09', 'name' => 'jon'),
array ('date' => '2012-05-16', 'name' => 'jon')

);

sort($array);

echo '<pre>';
print_r($array);
echo '</pre>';

Use already existing methods.

Avyakt
  • 315
  • 4
  • 10