为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用usort对MongoDB查询结果进行排序

如何使用usort对MongoDB查询结果进行排序

PHP
守着一只汪 2024-01-19 15:52:42
尝试对对象中存在的数组进行排序,但出现错误usort() 期望参数 1 为数组我在任何地方都没有找到此错误的任何有用的解决方案,如何按数组元素总数对数组[详细信息]进行排序。这是我的代码 -$query = new MongoDB\Driver\Query($filter, $options);$cursor = $manager->executeQuery("DB.col", $query);foreach($cursor as $row) {  foreach($row->detail as $item) {    function cmp($a, $b) {      return $a['detail'] > $b['detail'];    }    usort($row, "cmp");  }} 我的数组的架构:array(    [0]=>stdclass object(         [_id] => MongoDB\BSON\ObjectId Object (                    [oid] => 5f55f95815a8508e2deac8dd                )        [Date] => 9/12/2020        [title] => ram        [roll.n] => 5        [detail] => Array(            [0] => stdclass object(                 [title] => John                [id] =>55                [class] => six)            [1] => stdclass object(                 [title] => Doe                [id] =>550                [class] => six)            [2] => stdclass object(                 [title] => Jean                [id] =>9                [class] => one)            [3] => stdclass object(                 [title] => AI                [id] =>90                [class] => one)            )    )    [1]=>stdclass object(         [_id] => MongoDB\BSON\ObjectId Object (                [oid] => 5f        )        [title] => sunny        [roll.n] => 50        [detail] => Array(            [0] => stdclass object (                 [title] => lilly                [id] =>551                [class] => six)            [1] => stdclass object(                 [title] => Doel                [id] =>550                [class] => six)            [2] => stdclass object(                 [title] => rehaman                [id] =>9                [class] => one        )    ))
查看完整描述

1 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

executeQuery方法返回MongoDB\Driver\Cursor。它实现了Traversable接口,因此您可以foreach对其进行操作。这可能会让您感到困惑,认为它是一个数组。其实不是。

要对结果进行排序,您需要首先将游标转为数组。然后,如果我理解正确的话,您将按“详细信息”数组的大小对行进行排序,如下所示:

$query = new MongoDB\Driver\Query($filter, $options);

$cursor = $manager->executeQuery("DB.col", $query);

$rows = $cursor->toArray();


usort($rows, function ($a, $b) {

  return sizeof($a->detail) <=> sizeof($b->detail);

});


return $rows;

注意:如果顺序颠倒,只需交换call比较函数中的$a->detailand即可。$b->detailusort()

如果您没有使用 PHP 7,则可能没有可以使用的spaceship 运算符。 <=>只需使用此比较函数即可:

usort($rows, function ($a, $b) {

  if (sizeof($a->detail) == sizeof($b->detail)) {

    return 0;

  }

  return (sizeof($a->detail) > sizeof($b->detail)) ? 1 : -1;

});

PS 你真的应该升级到 PHP 7。PHP 5.6 已经不再支持多年了。它的性能较差且安全性较差。


查看完整回答
反对 回复 2024-01-19
  • 1 回答
  • 0 关注
  • 76 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信