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

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

public class Person
{
   private $name,$sex,$age;
   public function Person ($name,$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,$age)
   {
      $this->people[] = new Person($name,$age);
   }
}

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

解决方法

这是一个带有静态方法的工作代码.它还使用静态方法可以访问私有ivars的事实:)
它还使用PHP令人敬畏的反身性<3. 关于该代码的好处是Person是提供排序方法的类,从OOP的角度来看更好.只有类Person才能知道如何对其他Person进行排序.人或其他独立功能都不应该. 注意:不使用is_callable(),因为它只验证参数是否可以作为函数调用,但不检查它是否可以使用当前可见性实际调用(public,private,protected)

class Person
{
    private $name,$age;
    public function Person($name,$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,$age)
    {
        $this->people[] = new Person($name,$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',24);
$people->addPerson('Jane','F',26);
$people->addPerson('Sally',21);
$people->display();
$people->sort();
$people->display();
$people->sort('age');
$people->display();

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...