要对一列值进行排序, 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
在两个数组之间写入(作为第二个参数)。
usort()
当自定义函数体将 $a
数据放在宇宙飞船运算符的左侧并将 $b
数据放在右侧时,将按升序排序。 若要按降序排序,只需将 $b
数据写在左侧并将 $a
数据写在右侧即可。
两种方法都能够接收多个排序规则,但由于这个问题只要求对单个列进行排序,因此该指导在这里并不合适。
都调用一个函数(如 )效率会降低 strcmp()
。这不再是最佳实践。使用双向比较(如 >
或 <
)来返回布尔结果也不行。三向比较应该从 usort()
.
对于使用多个规则/列/属性对数据进行排序, 这个答案 提供了很好的指导。