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

新手上路,请多包涵

如何按其中一个字段对对象数组进行排序,例如 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
        )

   ....

原文由 Alex 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 906
2 个回答

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

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

usort($your_data, "cmp");

您还可以使用任何 可调用对象 作为第二个参数。这里有些例子:

     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

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

此外,如果您要比较数值, fn($a, $b) => $a->count - $b->count 作为“比较”函数应该可以解决问题,或者,如果您想要另一种方法来做同样的事情,从 PHP 7 开始,您可以使用 宇宙飞船操作员,像这样: fn($a, $b) => $a->count <=> $b->count

原文由 cambraca 发布,翻译遵循 CC BY-SA 4.0 许可协议

要对一列值进行排序,组合 array_column()array_multisort() 是一种明智的方式。 演示

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

或者只调用 usort() 与宇宙飞船操作员在这种情况下执行较少的迭代。 演示

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

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

即使您可变地声明要排序的列,这两种方法都允许使用该变量而无需任何附加技术。

带变量的多排序演示

$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 数据放在 spaceship 运算符的左侧和 $b 数据放在右侧时,将按升序排序。要按降序排序,只需在左侧写入 $b $a ,在右侧写入 --- 数据。

这两种方法都能够接收多个排序规则,但是因为这个问题只要求对单个列进行排序,所以这里的指导是不合适的。

排序时在每次迭代中调用函数(如 strcmp() )效率会降低。这不再是最佳实践。也没有使用双向比较(如 >< )来返回布尔结果。预计从 usort() 进行三向比较。

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

原文由 mickmackusa 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题