Sort Objects by Property with PHP

By  on  

I recently needed to display a list of authors within a WordPress blog.  The goal was to sort the author list by number of posts before outputting the list.  The method for calculating number of posts isn't a sortable key within WordPress' get_posts, so I had to sort the result list myself.  PHP's usort method, along with a custom function, allows you to accomplish the feat of sorting a collection of objects by key.

The PHP

The first step is creating the function that does the sorting -- this is that function:

function sort_objects_by_total($a, $b) {
	if($a->total_posts == $b->total_posts){ return 0 ; }
	return ($a->total_posts < $b->total_posts) ? -1 : 1;
}

The function returns -1 (smaller than), 0 (equal to), or 1 (larger than) when doing the sort comparisons.  The last is applying the sortation function to the array, which is done by usort:

usort($users, 'sort_objects_by_total');

The code above now ensures that my authors array is sorted by total_posts.  Keep this snippet in your PHP toolbox for the future -- I'm certain you'll need it at one time or another.

Recent Features

  • By
    An Interview with Eric Meyer

    Your early CSS books were instrumental in pushing my love for front end technologies. What was it about CSS that you fell in love with and drove you to write about it? At first blush, it was the simplicity of it as compared to the table-and-spacer...

  • By
    LightFace:  Facebook Lightbox for MooTools

    One of the web components I've always loved has been Facebook's modal dialog.  This "lightbox" isn't like others:  no dark overlay, no obnoxious animating to size, and it doesn't try to do "too much."  With Facebook's dialog in mind, I've created LightFace:  a Facebook lightbox...

Incredible Demos

  • By
    HTML5 Input Types Alternative

    As you may know, HTML5 has introduced several new input types: number, date, color, range, etc. The question is: should you start using these controls or not? As much as I want to say "Yes", I think they are not yet ready for any real life...

  • By
    background-size Matters

    It's something that makes all men live in fear, and are often uncertain of. It's never spoken, but the curiosity is always there. Nine out of ten women agree in the affirmative. Advertisers do their best to make us feel inadequate but...

Discussion

  1. Sorin Badea

    Such a great discovery … this surely deserves a blog post.

  2. Rocka

    In PHP 5.3 and newer you could even use an anonymous function with usort (and all other functions that accept callables as parameter).

  3. The problem is usort is very slow. So if you want to sort many elements, you’d better learn how to use array_multisort.

  4. The sort_objects_by_total function can be further simplified:

    return $a->total_posts - $b->total_posts
  5. You’ll need this if you ever want to sort users by last name, since user_lastname is not one of the built-in orderby options. Did it yesterday, in fact.

  6. Abby

    Hi Everyone,

    I want to start my carrier in Php, but I am really confused fro where to start as I do not have any knowledge of php. Is it necessary to learn php with My SQL? I really need some books and other stuff to learn php apart from training. For classes I am starting my course at http://www.wiziq.com/course/5871-php-mysql-with-basic-javascript-integrated-course but I am still confused with which books to follow. I will really appreciate if you can guide me with some good books.

    Regards
    Abby

  7. The function in PHP is not too dissimilar to the JavaScript sort method.
    http://www.w3schools.com/jsref/jsref_sort.asp

    For quite some time i have been using both for cached JSON data, very powerful, but both have thier own gotcha’s to be wary of, specifically in date/datetime and various integer types sorting.

  8. qwerty

    You can do it with https://github.com/letsdrink/ouzo-goodies

    $result = Arrays::sort(array($person1, $person2), Comparator::compareBy('age'));
    

    See http://ouzo.readthedocs.org/en/latest/utils/comparators.html

  9. Marcel

    sort_objects_by_total is not a good name for your comparator function, it should rather be something like compare_objects_by_total_posts.

  10. Thanks David!
    I used your code to first compare the items by one property and then by another, to sort sections by subsections (Eg: 234 before 234A and 234B)
    Had a huge problem with later added subsections showing up last in the list fetched from the database.

    function sort_object_callback($a, $b){
    	if( $a->S == $b->S ) {
    		if( $a->SS == $b->SS ) { return 0; }
    		else return ( $a->SS SS ) ? -1 : 1;
    	}
    	return ( $a->S S ) ? -1 : 1;
    }
    

    Cheers mate!

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!