Группировать и упорядочивать массив объектов в php по строковому значению

У меня есть массив объектов, который выглядит так, обратите внимание, что они уже упорядочены по create_time через MYSQL:

array (size=5)
  0 => 
    object(stdClass)[38]
      public 'vacancy_id' => int 5
      public 'title' => string 'test title' (length=10)
      public 'create_time' => string '2018-10-05 11:15:34' (length=19)
      public 'language_iso' => string 'NL' (length=2)
  1 => 
    object(stdClass)[42]
      public 'vacancy_id' => int 9
      public 'title' => string 'test title 5' (length=12)
      public 'create_time' => string '2018-08-05 11:15:34' (length=19)
      public 'language_iso' => string 'EN' (length=2)
  2 => 
    object(stdClass)[40]
      public 'vacancy_id' => int 7
      public 'title' => string 'test title 3' (length=12)
      public 'create_time' => string '2018-08-05 11:15:34' (length=19)
      public 'language_iso' => string 'FR' (length=2)
  3 => 
    object(stdClass)[39]
      public 'vacancy_id' => int 6
      public 'title' => string 'test title 2' (length=12)
      public 'create_time' => string '2018-06-05 11:15:34' (length=19)
      public 'language_iso' => string 'FR' (length=2)
  4 => 
    object(stdClass)[41]
      public 'vacancy_id' => int 8
      public 'title' => string 'test title 4' (length=12)
      public 'create_time' => string '2018-02-05 11:15:34' (length=19)
      public 'language_iso' => string 'NL' (length=2)

На моей странице я реализую функцию сортировки. Есть (на данный момент) 4 варианта сортировки:

  • По create_time (это тоже сортировка по умолчанию, как и в MySQL. И я всегда хочу сохранить эту сортировку).
  • По NL язык iso
  • По языку FR iso
  • По EN язык iso

В примере с массивом, приведенном выше, допустим, я хочу отсортировать по «FR язык iso». Это означает, что я хочу, чтобы мой набор результатов выглядел так:

array (size=5)
  0 => 
    object(stdClass)[40]
      public 'vacancy_id' => int 7
      public 'title' => string 'test title 3' (length=12)
      public 'create_time' => string '2018-08-05 11:15:34' (length=19)
      public 'language_iso' => string 'FR' (length=2)
  1 => 
    object(stdClass)[39]
      public 'vacancy_id' => int 6
      public 'title' => string 'test title 2' (length=12)
      public 'create_time' => string '2018-06-05 11:15:34' (length=19)
      public 'language_iso' => string 'FR' (length=2)
  2 => 
    object(stdClass)[38]
      public 'vacancy_id' => int 5
      public 'title' => string 'test title' (length=10)
      public 'create_time' => string '2018-10-05 11:15:34' (length=19)
      public 'language_iso' => string 'NL' (length=2)
  3 => 
    object(stdClass)[42]
      public 'vacancy_id' => int 9
      public 'title' => string 'test title 5' (length=12)
      public 'create_time' => string '2018-08-05 11:15:34' (length=19)
      public 'language_iso' => string 'EN' (length=2)
  4 => 
    object(stdClass)[41]
      public 'vacancy_id' => int 8
      public 'title' => string 'test title 4' (length=12)
      public 'create_time' => string '2018-02-05 11:15:34' (length=19)
      public 'language_iso' => string 'NL' (length=2)

Итак, в этом примере результат должен содержать:

  • Результаты с language_iso FR наверху, но все же внутри них, отсортированные по create_time
  • Результаты с language_iso EN и NL идут под результатами FR, но также и внутри них, отсортированные по create_time

Я полностью работал пустым, используя пользовательскую функцию в функции usort php.


person Dennis    schedule 08.10.2019    source источник


Ответы (1)


Вы можете (и, вероятно, должны) полностью справиться с этим требованием сортировки из MySQL:

SELECT vacancy_id, title, create_time, language_iso
FROM yourTable
ORDER BY
    IF(language_iso = 'FR', 0, 1),
    create_time;

Вышеприведенный пункт ORDER BY будет охватывать записи на французском языке, идущие первыми, а затем все остальные языки, а пункт create_time будет охватывать сортировку в качестве второго шага.

Хотя вы можете попытаться отсортировать заданный массив/результирующий набор внутри PHP, на практике вам может потребоваться всегда запрашивать, так как базовые данные могут устареть.

person Tim Biegeleisen    schedule 08.10.2019
comment
Это отлично решает проблему! Раньше я искал решение mysql, но не мог его найти и думал, что его будет проще решить в php. Оказывается, я так ошибался! Еще раз спасибо за очень простое решение. - person Dennis; 08.10.2019
comment
@Dennis Если у вас есть более сложные требования и вы хотите упорядочить каждый язык в определенном порядке, рассмотрите возможность использования FIELD, например. ORDER BY FIELD(language_iso, 'FR', 'EN', 'NL'), что поставило бы французский перед английским, перед нидерландским. - person Tim Biegeleisen; 08.10.2019