📌  相关文章
📜  PHP按对象字段对对象数组进行排序(1)

📅  最后修改于: 2023-12-03 15:18:34.261000             🧑  作者: Mango

PHP按对象字段对对象数组进行排序

在开发过程中,我们经常需要对数组进行排序操作。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
        )
)