📅  最后修改于: 2023-12-03 15:18:34.261000             🧑  作者: Mango
在开发过程中,我们经常需要对数组进行排序操作。PHP的数组排序函数功能非常强大,但是当我们需要按照对象字段进行排序时,需要进行一些额外的操作。本文将介绍如何使用PHP对对象数组进行排序。
我们可以使用PHP内置的 usort()
函数进行排序,首先我们需要定义一个比较函数用于比较两个对象的大小,然后将这个比较函数作为 usort()
函数的第二个参数。比较函数需要返回一个负整数、0或正整数,表示第一个参数小于、等于或大于第二个参数。
以下示例按照对象的 age
字段进行排序:
class Person {
public $name;
public $age;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
}
$people = [
new Person('Bob', 30),
new Person('Alice', 25),
new Person('John', 40)
];
usort($people, function($a, $b) {
return $a->age - $b->age;
});
print_r($people);
以上代码将输出:
Array
(
[0] => Person Object
(
[name] => Alice
[age] => 25
)
[1] => Person Object
(
[name] => Bob
[age] => 30
)
[2] => Person Object
(
[name] => John
[age] => 40
)
)
如果我们需要按照对象的多个字段进行排序,比较函数需要进行相应的修改。以下示例按照 age
字段升序排序,如果 age
相同则按照 name
字段升序排序:
usort($people, function($a, $b) {
if ($a->age === $b->age) {
return strcmp($a->name, $b->name);
}
return $a->age - $b->age;
});
如果需要按照自定义的规则进行排序,我们可以实现一个比较函数来实现该功能。比如以下示例按照对象的 name
字段按照字母表顺序排序,但是将字母 e
作为最小值进行排序:
usort($people, function($a, $b) {
$a_name = str_replace('e', '', $a->name);
$b_name = str_replace('e', '', $b->name);
return strcmp($a_name, $b_name);
});
class Person {
public $name;
public $age;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
}
$people = [
new Person('Bob', 30),
new Person('Alice', 25),
new Person('John', 40)
];
usort($people, function($a, $b) {
if ($a->age === $b->age) {
return strcmp($a->name, $b->name);
}
return $a->age - $b->age;
});
print_r($people);
以上代码将输出:
Array
(
[0] => Person Object
(
[name] => Alice
[age] => 25
)
[1] => Person Object
(
[name] => Bob
[age] => 30
)
[2] => Person Object
(
[name] => John
[age] => 40
)
)