如何在PHP中对对象数组进行排序?

Cli*_*ote 3 php arrays sorting oop

假设我有一群人,每个人都有姓名,性别和年龄属性,编码如下:

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);
   }
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现一个方法sortPeople(),按照$people人们名字的升序将数组排序到People类中?

Thi*_*tte 8

这是一个带有静态方法的工作代码.它还使用静态方法可以访问私有ivars的事实:)它还使用PHP真棒反身性<3.

关于该代码的好处Person是提供sort方法的类,这在OOP的观点上更好.只有该类Person应该知道如何对其他类进行排序Person.任何一个People或另一个独立功能都不应该.

注意:不使用is_callable(),因为它只验证参数是否可以作为函数调用,但不检查它是否可以使用当前可见性实际调用(公共,私有,受保护)

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();
Run Code Online (Sandbox Code Playgroud)