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

尝试对对象中存在的数组进行排序,但出现错误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

        )

    )

)


守着一只汪
浏览 78回答 1
1回答

扬帆大鱼

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 已经不再支持多年了。它的性能较差且安全性较差。
打开App,查看更多内容
随时随地看视频慕课网APP