我如何排序这个对象数组的一个字段,如名称或计数?

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
        )

   ....

当前回答

如果一切都失败了,还有另一个解决方案:

$names = array(); 
foreach ($my_array as $my_object) {
    $names[] = $my_object->name; //any object field
}

array_multisort($names, SORT_ASC, $my_array);

return $my_array;

其他回答

你可以这样用usort:

usort($array,function($first,$second){
    return strcmp($first->name, $second->name);
});

如果你想对日期排序

   usort($threads,function($first,$second){
        return strtotime($first->dateandtime) < strtotime($second->dateandtime);
    });

要对一列值进行排序,array_column()和array_multisort()的组合是一种合理的方法。演示

array_multisort(array_column($array, 'count'), $array);

或者在这种情况下,只使用太空船操作符调用usort()以减少迭代。演示

usort($array, fn($a, $b) => $a->count <=> $b->count);

注意,尽管计数值被转换为输入数组中的字符串类型值,但这两个排序函数都将正确地按数字排序,而不是按字母顺序排序(错误地将23420放在420之前)。这是一个可靠的默认特性。

即使变量声明要排序的列,这两种方法都允许使用变量,而不需要任何添加技术。

带变量的多排序演示

$property = 'count';
array_multisort(array_column($array, $property), $array);

使用变量Usort演示

$property = 'count';
usort($array, fn($a, $b) => $a->$property <=> $b->$property);

这两个原生排序函数都是通过引用修改的,所以不要尝试通过它们的返回值访问已排序的数组。

array_multisort()的默认排序方向是升序的,因此在两个数组参数之间显式使用SORT_ASC没有任何好处。如果需要降序排序,则在两个数组之间写入SORT_DESC(作为第二个参数)。

当自定义函数体将$a数据放在宇宙飞船操作符的左侧,$b数据放在右侧时,Usort()将升序排序。对于降序排序,只需将$b的数据写在左边,$a的数据写在右边。

这两种方法都能够接收多个排序规则,但是由于这个问题只要求对单个列进行排序,因此在这里不适合使用该指导。

在排序时每次迭代都调用函数(如strcmp())效率较低。这不再是最佳实践。使用双向比较(如>或<)来返回布尔结果也不是这样。usort()期望进行三向比较。

对于有多个规则/列/属性的数据排序,这个答案提供了很好的指导。

如果你想对整数值进行排序:

// Desc sort
usort($array,function($first,$second){
    return $first->number < $second->number;
});

// Asc sort
usort($array,function($first,$second){
    return $first->number > $second->number;
});

更新 使用字符串时不要忘记转换为相同的寄存器(上寄存器或下寄存器)

// Desc sort
usort($array,function($first,$second){
    return strtolower($first->text) < strtolower($second->text);
});

// Asc sort
usort($array,function($first,$second){
    return strtolower($first->text) > strtolower($second->text);
});

如果需要基于本地的字符串比较,可以使用strcoll而不是strcmp。

记住,如果需要,首先使用setlocale和LC_COLLATE来设置区域信息。

  usort($your_data,function($a,$b){
    setlocale (LC_COLLATE, 'pl_PL.UTF-8'); // Example of Polish language collation
    return strcoll($a->name,$b->name);
  });