Donatas Veikutis
Donatas Veikutis

Reputation: 1004

PHP object array sorting

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.

Upvotes: 1

Views: 1269

Answers (4)

web-nomad
web-nomad

Reputation: 6003

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.

Upvotes: 1

Avyakt
Avyakt

Reputation: 315

$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.

Upvotes: 0

Jack
Jack

Reputation: 5768

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

Upvotes: 1

Sampson
Sampson

Reputation: 268344

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

Upvotes: 2

Related Questions