gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 23:59:49 26 4
gpt4 key购买 nike

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

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);
}
}

我怎样才能实现一个方法 sortPeople() 以人名到 People 的升序对 $people 数组进行排序类(class)?

最佳答案

这是一个带有静态方法的工作代码。它还使用静态方法可以访问私有(private) ivars 的事实:)它还使用 PHP 令人敬畏的自反性 <3.

该代码的优点在于 Person 是提供排序方法的类,从 OOP 的角度来看更好。只有类 Person 应该知道如何对其他 Person 进行排序。 People 或其他独立函数都不应该。

注意:不使用 is_callable(),因为它只验证参数是否可以作为函数调用,但不检查它是否真的可以在当前可见性(公共(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();

关于php - 如何在 PHP 中对对象数组进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1528561/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com