Как использовать usort для сортировки результата запроса MongoDB

#php #arrays #mongodb #loops #sorting

#php #массивы #mongodb #циклы #сортировка

Вопрос:

Пытаюсь отсортировать массив, присутствующий в объекте, но получаю ошибку usort() ожидает, что параметр 1 будет массивом Я нигде не нашел полезного решения для этой ошибки, как я могу отсортировать свой массив [подробно] по общему количеству элементов массива.

Вот мой код —

 $query = new MongoDBDriverQuery($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] => MongoDBBSONObjectId 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] => MongoDBBSONObjectId 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.Почему ваш код для сортировки $row внутри foreach использует $row ?

2. печать других значений массива-> подробности с его помощью вы можете проверить структуру массива, описанную выше, в деталях содержатся элементы, которые я печатаю,

3. Что вы подразумеваете под «отсортировать мой массив по общему количеству элементов массива»?

4. @Mike’Pomax’Camermans как я могу отсортировать весь объект по количеству подробных массивов

5. @Nick Я пытаюсь отсортировать в порядке убывания по общему количеству элементов, присутствующих в деталях, как для первого объекта, 4 элемента находятся в массиве [detail], я пытаюсь отсортировать по его количеству

Ответ №1:

Метод ExecuteQuery возвращает MongoDBDriverCursor. Он реализует проходимый интерфейс, поэтому вам разрешено делать foreach на нем. Возможно, вас смутило, что это массив. На самом деле это не так.

Чтобы выполнить usort для результата, вам нужно сначала превратить курсор в массив. Затем, если я правильно понимаю, вы должны отсортировать строки по размеру их массива «detail» следующим образом:

 $query = new MongoDBDriverQuery($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;
  

Примечание: если порядок обратен, просто поменяйте местами $a->detail и $b->detail в функции сравнения usort() call.

Если вы не используете 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;
});
  

P.S. Вам действительно следует перейти на PHP 7. PHP 5.6 был удален из поддержки в течение многих лет. Это не так производительно и менее безопасно.

Комментарии:

1. Какая строка? И какую версию PHP вы используете?

2. Я использую PHP версии 5.6, получаю ошибку в этой строке — верните sizeof($a-> detail) <=> sizeof($b-> detail);

3. Серьезно, вам нужно обновить свой PHP.

4. Как я могу упорядочить по дате после использования usort?

5. Я не вижу никакого поля даты или времени в вашем примере данных. Откуда вы знаете, какая дата для объекта?