How to sort an array of objects in PHP?

arrays, oop, php, sorting

Solution

Here is a working code with a static method. It also uses the fact that the static method can access private ivars :) It also uses PHP awesome reflexivity <3.

The good point about that code is that `Person` is the class to provide the sort method, which is better on an OOP point of view. Only the class `Person` should be the one to know how to sort other `Person`. Neither `People` or another indepent function should.

Note: not using `is_callable()`, as it only verifies if the parameter can be called as a function, but does not check if it's actually callable with the current visibility (public, private, protected)

class Person
{
    private $name, $sex, $age;
    public function Person($name, $sex, $age)
    {
        $this->name = $name;
        $this->sex = $sex;
        $this->age = $age;
    }

    public static function sortByName(Person $p1, Person $p2)
    {
        return strcmp($p1->name, $p2->name);
    }

    public static function sortByAge(Person $p1, Person $p2)
    {
        return ($p1->age - $p2->age);
    }
}

class People
{
    private $people = array();
    public function addPerson($name, $sex, $age)
    {
        $this->people[] = new Person($name, $sex, $age);
    }

    public function display()
    {
        print_r($this->people);
    }

    public function sort($attribute = 'name')
    {
        $sortFct = 'sortBy' . ucfirst(strtolower($attribute));
        if (!in_array($sortFct, get_class_methods('Person')))
        {
            throw new Exception('People->sort(): Can\'t sort by ' . $attribute);
        }
        usort($this->people, 'Person::' . $sortFct);
    }
}

$people = new People;
$people->addPerson('Steve', 'M', 31);
$people->addPerson('John', 'M', 24);
$people->addPerson('Jane', 'F', 26);
$people->addPerson('Sally', 'F', 21);
$people->display();
$people->sort();
$people->display();
$people->sort('age');
$people->display();

Problem

Say I have a group of people, each person having a name, sex, and age property, coded like this: ``` public class Person { private $name, $sex, $age; public function Person ($name, $sex, $age) { $this->name = $name; $this->sex = $sex; $this->age = $age; } public function getName(); public function getSex(); public function getAge(); } public class People { private $people = array(); public function addPerson ($name, $sex, $age) { $this->people[] = new Person($name, $sex, $age); } } ``` How could I implement a method `sortPeople()` which sorted the `$people` array in ascending order of the peoples' names to the `People` class?

Original source