按一个属性对对象数组进行排序

如何按对象的一个字段(如 或 )对此对象数组进行排序?namecount

Array
(
    [0] => stdClass Object
        (
            [ID] => 1
            [name] => Mary Jane
            [count] => 420
        )

    [1] => stdClass Object
        (
            [ID] => 2
            [name] => Johnny
            [count] => 234
        )

    [2] => stdClass Object
        (
            [ID] => 3
            [name] => Kathy
            [count] => 4354
        )

   ....

答案 1

使用 usort,这是一个改编自手册的示例:

function cmp($a, $b) {
    return strcmp($a->name, $b->name);
}

usort($your_data, "cmp");

您还可以使用任何可调用的参数作为第二个参数。以下是一些示例:

  • 使用匿名函数(从 PHP 5.3 开始)

      usort($your_data, function($a, $b) {return strcmp($a->name, $b->name);});
    
  • 从类内部

      usort($your_data, array($this, "cmp")); // "cmp" should be a method in the class
    
  • 使用箭头函数(从 PHP 7.4 开始)

      usort($your_data, fn($a, $b) => strcmp($a->name, $b->name));
    

另外,如果你正在比较数值,因为“比较”函数应该可以做到这一点,或者,如果你想要另一种做同样的事情的方式,从PHP 7开始,你可以使用Spaceship运算符,如下所示:.fn($a, $b) => $a->count - $b->countfn($a, $b) => $a->count <=> $b->count


答案 2

这是使用闭包的更好方法

usort($your_data, function($a, $b)
{
    return strcmp($a->name, $b->name);
});

请注意,这在PHP的文档中没有,但是如果您使用5.3 +闭包,则可以提供可调用的参数。