Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

martinszeltins's avatar

Can't get sortBy to work with a timestamp - getting wrong order

I have an array that I converted to a Collection with collect($array) and then tried to sort it by activity_time but it's not sorting it.

$latest_activities = collect($latest_activities)->sortByDesc('activity_time');

But I'm getting this result:

{
    "0": {
        "activity_time": "2019-04-29 12:03:15",
        "activity_title": "User logged in",
    },
    "1": {
        "activity_time": "2019-04-29 11:59:07",
        "activity_title": "User opened profile page",
    },
    "2": {
        "activity_time": "2019-04-16 17:35:50",
        "activity_title": "User logged out",
    },
    "3": {
        "activity_time": "2019-04-29 11:56:40",
        "activity_title": "User commented on",
    }
}
0 likes
12 replies
martinszeltins's avatar

I tried doing this but still getting wrong results.

$latest_activities = collect($latest_activities)->sortByDesc(function ($item, $key) {
    return Carbon::parse($item->activity_time)->timestamp;
});

result:

{
    "0": {
        "activity_time": "2019-04-29 12:28:07"
    },
    "1": {
        "activity_time": "2019-04-29 12:25:31"
    },
    "2": {
        "activity_time": "2019-04-16 17:10:24"
    },
    "3": {
        "activity_time": "2019-04-29 12:24:53"
    }
}
hondnl's avatar

Try converting it to an integer... just use strtotime for example.

$latest_activities =collect($latest_activities)->sortByDesc(function($item,$key){
             return strtotime($item['activity_time']);
        });

That must work : I tested it with the following :


 $test =[
            ['date' =>'2019-04-29 12:28:07'],
            ['date' =>'2019-04-29 12:25:31'],
            ['date' =>'2019-04-16 17:10:24'],
            ['date' =>'2019-04-29 12:24:53'],
        ];


        $test =collect($test)->sortByDesc(function($item,$key){
             return strtotime($item['date']);
        });
martinszeltins's avatar

@HONDNL - Still wrong results

$latest_activities = collect($latest_activities)->sortByDesc(function ($item, $key) {
    return strtotime($item->activity_time);
});

result:

{
    "0": {
        "activity_time": "2019-04-29 12:28:07"
    },
    "1": {
        "activity_time": "2019-04-29 12:25:31"
    },
    "2": {
        "activity_time": "2019-04-16 17:10:24"
    },
    "3": {
        "activity_time": "2019-04-29 12:24:53"
    }
}
martinszeltins's avatar

Original collection

return collect($latest_activities);

[
    {
        "activity_time": "2019-04-29 12:32:40"
    },
    {
        "activity_time": "2019-04-29 12:31:28"
    },
    {
        "activity_time": "2019-04-29 12:30:17"
    },
    {
        "activity_time": "2019-04-29 12:28:07"
    },
    {
        "activity_time": "2019-04-29 12:25:31"
    },
    {
        "activity_time": "2019-04-29 12:24:57"
    },
    {
        "activity_time": "2019-04-29 12:23:56"
    },
    {
        "activity_time": "2019-04-29 12:23:05"
    },
    {
        "activity_time": "2019-04-29 12:21:24"
    },
    {
        "activity_time": "2019-04-29 12:17:35"
    },
    {
        "activity_time": "2019-04-29 11:18:17"
    },
    {
        "activity_time": "2019-04-17 12:40:17"
    },
    {
        "activity_time": "2019-04-17 12:40:17"
    },
    {
        "activity_time": "2019-04-16 17:35:50"
    },
    {
        "activity_time": "2019-04-16 17:10:24"
    },
    {
        "activity_time": "2019-04-16 16:45:36"
    },
    {
        "activity_time": "2019-04-16 16:44:58"
    },
    {
        "activity_time": "2019-04-16 16:22:13"
    },
    {
        "activity_time": "2019-04-16 16:17:55"
    },
    {
        "activity_time": "2019-04-16 15:22:08"
    },
    {
        "activity_time": "2019-04-29 12:43:17"
    },
    {
        "activity_time": "2019-04-29 12:27:18"
    },
    {
        "activity_time": "2019-04-29 12:27:17"
    },
    {
        "activity_time": "2019-04-29 12:27:16"
    },
    {
        "activity_time": "2019-04-29 12:27:15"
    },
    {
        "activity_time": "2019-04-29 12:27:13"
    },
    {
        "activity_time": "2019-04-29 12:27:11"
    },
    {
        "activity_time": "2019-04-29 12:27:08"
    },
    {
        "activity_time": "2019-04-29 12:26:57"
    },
    {
        "activity_time": "2019-04-29 12:24:55"
    }
]

Sorted collection (wrong)

$latest_activities = $latest_activities->sortByDesc(function ($item, $key) {
    return strtotime($item->activity_time);
});

return $latest_activities;


{
    "0": {
        "activity_time": "2019-04-29 12:43:22"
    },
    "1": {
        "activity_time": "2019-04-29 12:37:43"
    },
    "2": {
        "activity_time": "2019-04-29 12:32:40"
    },
    "3": {
        "activity_time": "2019-04-29 12:31:28"
    },
    "4": {
        "activity_time": "2019-04-29 12:30:17"
    },
    "5": {
        "activity_time": "2019-04-29 12:28:07"
    },
    "6": {
        "activity_time": "2019-04-29 12:25:31"
    },
    "7": {
        "activity_time": "2019-04-29 12:24:57"
    },
    "8": {
        "activity_time": "2019-04-29 12:23:56"
    },
    "9": {
        "activity_time": "2019-04-29 12:23:05"
    },
    "10": {
        "activity_time": "2019-04-29 11:18:17"
    },
    "11": {
        "activity_time": "2019-04-17 12:40:17"
    },
    "12": {
        "activity_time": "2019-04-17 12:40:17"
    },
    "13": {
        "activity_time": "2019-04-16 17:35:50"
    },
    "14": {
        "activity_time": "2019-04-16 17:10:24"
    },
    "15": {
        "activity_time": "2019-04-16 16:45:36"
    },
    "16": {
        "activity_time": "2019-04-16 16:44:58"
    },
    "17": {
        "activity_time": "2019-04-16 16:22:13"
    },
    "18": {
        "activity_time": "2019-04-16 16:17:55"
    },
    "19": {
        "activity_time": "2019-04-16 15:22:08"
    },
    "20": {
        "activity_time": "2019-04-29 12:45:46"
    },
    "21": {
        "activity_time": "2019-04-29 12:45:44"
    },
    "22": {
        "activity_time": "2019-04-29 12:43:17"
    },
    "23": {
        "activity_time": "2019-04-29 12:27:18"
    },
    "24": {
        "activity_time": "2019-04-29 12:27:17"
    },
    "25": {
        "activity_time": "2019-04-29 12:27:16"
    },
    "26": {
        "activity_time": "2019-04-29 12:27:15"
    },
    "27": {
        "activity_time": "2019-04-29 12:27:13"
    },
    "28": {
        "activity_time": "2019-04-29 12:27:11"
    },
    "29": {
        "activity_time": "2019-04-29 12:27:08"
    }
}
hondnl's avatar

@MARTINZELTIN - Show me the original $latest_activities array...

And strtotime($activities['activity_time']); btw..

hondnl's avatar

@MARTINZELTIN - There must be something wrong in your original array. I am asking about the output of the original array ( before collect) , not the collection.

Look at this example . This works, so there must be something different with the inital input.


$activity_time =[
            ['activity_time' =>'2019-04-29 12:28:07'],
            ['activity_time' =>'2019-04-29 12:25:31'],
            ['activity_time' =>'2019-04-16 17:10:24'],
            ['activity_time' =>'2019-04-29 12:24:53'],
        ];



        $activity_time =collect($activity_time )->sortByDesc(function($item,$key){

             return strtotime($item['activity_time']);
        });

        dd($activity_time);

martinszeltins's avatar

@HONDNL - Here is the original array print_r($latest_activities);

Array
(
    [0] => stdClass Object
        (
            [activity_time] => 2019-04-29 13:48:17
        )

    [1] => stdClass Object
        (
            [activity_time] => 2019-04-29 13:47:26
        )

    [2] => stdClass Object
        (
            [activity_time] => 2019-04-29 13:41:53
        )

    [3] => stdClass Object
        (
            [activity_time] => 2019-04-29 13:37:43
        )

    [4] => stdClass Object
        (
            [activity_time] => 2019-04-29 13:33:33
        )

    [5] => stdClass Object
        (
            [activity_time] => 2019-04-29 13:06:35
        )

    [6] => stdClass Object
        (
            [activity_time] => 2019-04-29 13:00:26
        )

    [7] => stdClass Object
        (
            [activity_time] => 2019-04-29 12:59:23
        )

    [8] => stdClass Object
        (
            [activity_time] => 2019-04-29 12:58:21
        )

    [9] => stdClass Object
        (
            [activity_time] => 2019-04-29 12:54:50
        )

    [10] => stdClass Object
        (
            [activity_time] => 2019-04-29 11:18:17
        )

    [11] => stdClass Object
        (
            [activity_time] => 2019-04-17 12:40:17
        )

    [12] => stdClass Object
        (
            [activity_time] => 2019-04-17 12:40:17
        )

    [13] => stdClass Object
        (
            [activity_time] => 2019-04-16 17:35:50
        )

    [14] => stdClass Object
        (
            [activity_time] => 2019-04-16 17:10:24
        )

    [15] => stdClass Object
        (
            [activity_time] => 2019-04-16 16:45:36
        )

    [16] => stdClass Object
        (
            [activity_time] => 2019-04-16 16:44:58
        )

    [17] => stdClass Object
        (
            [activity_time] => 2019-04-16 16:22:13
        )

    [18] => stdClass Object
        (
            [activity_time] => 2019-04-16 16:17:55
        )

    [19] => stdClass Object
        (
            [activity_time] => 2019-04-16 15:22:08
        )

    [20] => stdClass Object
        (
            [activity_time] => 2019-04-29 13:50:32
        )

    [21] => stdClass Object
        (
            [activity_time] => 2019-04-29 13:50:27
        )

    [22] => stdClass Object
        (
            [activity_time] => 2019-04-29 13:50:25
        )

    [23] => stdClass Object
        (
            [activity_time] => 2019-04-29 13:50:22
        )

    [24] => stdClass Object
        (
            [activity_time] => 2019-04-29 13:50:19
        )

    [25] => stdClass Object
        (
            [activity_time] => 2019-04-29 13:50:16
        )

    [26] => stdClass Object
        (
            [activity_time] => 2019-04-29 13:48:12
        )

    [27] => stdClass Object
        (
            [activity_time] => 2019-04-29 13:47:38
        )

    [28] => stdClass Object
        (
            [activity_time] => 2019-04-29 13:47:37
        )

    [29] => stdClass Object
        (
            [activity_time] => 2019-04-29 13:47:23
        )

)
martinszeltins's avatar
martinszeltins
OP
Best Answer
Level 14

Found where the problem was. I had to call values() on the sorted collection. Now it is correct order.

$latest_activities = $latest_activities->sortByDesc(function ($item, $key) {
            return strtotime($item->activity_time);
})->values();
hondnl's avatar

This is weird... Alright so you got an array of objects... Not just a plain array.

But even when I try to replicate a part of your array , I get the results we want.

 $activity_time =[
            (object) ['activity_time' =>'2019-04-29 12:28:07'],
            (object) ['activity_time' =>'2019-04-29 12:25:31'],
            (object)  ['activity_time' =>'2019-04-16 17:10:24'],
            (object)   ['activity_time' =>'2019-04-29 12:24:53'],
            (object)   ['activity_time' =>'2019-04-17 12:40:17'],
        ];

        $activity_time =collect($activity_time )->sortByDesc(function($item,$key){


             return strtotime($item->activity_time);
        });

        dd($activity_time);

There might be something going wrong because of the objects... Try to do the following :


 $activity_time=collect($activity_time)->map(function($item){

            return [
                'activity_time' =>$item->activity_time
            ];
        })->sortByDesc(function($item,$key){

            return strtotime($item['activity_time']);
        });
hondnl's avatar

@MARTINZELTIN - It does not make sense... The only thing values() does is reset the order of the keys in the array. It should not make a difference in the order of the values.

sortBy works for me on both plain array and an array of objects. I still does not make sense you got a different output.

Please or to participate in this conversation.