Сортировка по N значений?

Добрый день! У меня есть список товаров, у которого много значений, по которым их нужно отсортировать, но проблема здесь в том, что кол-во значений всегда меняется и я не знаю какое будет кол-во полей.

$products = [
 0=>[
  'title' => 'prod 1',
   'more options...'
   'sort_0' => 3,
   'sort_1' => 2
   'sort_2' => 16
   'sort_3' => 1
 ],
 1=>[
  'title' => 'prod 2',
   'more options...'
   'sort_0' => 1,
   'sort_1' => 2
   'sort_2' => 11
   'sort_3' => 5
 ],
]


Подскажите, а в какую собственно сторону смотреть? Количество опций, неопределенно и может менятся. Как их все вычленить и по всем, провести сортировку?
  • Вопрос задан
  • 64 просмотра
Пригласить эксперта
Ответы на вопрос 3
Gomonov
@Gomonov
смотрите в сторону usort
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега PHP
♬♬
может, просто слепить значения в строку и сортировать по строке?
$tosort = array_map(
  function($el) {
    $el['sortable'] = implode(',', [$el['sort_0'], $el['sort_1'], $el['sort_2'], $el['sort_3']]);
    return $el;
  },
  $products
);

$result = usort(
  tosort,
  function( $a, $b) {
    return $a.sortable < $b.sortable ? -1 : 1;
  }
);


p.s. Как «прекрасен» PHP, посмотри:

Как раз в этом коде понадобились два метода для работы с массивами, и у одного
array_map() аргументом сначала идёт callable, потом массив;
а у другого
usort() наоборот: сначала массив, потом callable.
¯\_(ツ)_/¯
Ответ написан
bigton
@bigton
Web-программист
$array = [
    ['sort_1' => 1, 'sort_2' => 22, 'sort_3' => 23],
    ['sort_1' => 5, 'sort_2' => 12, 'sort_3' => 13],
    ['sort_1' => 3, 'sort_2' => 21, 'sort_3' => 43],
];

$fields = ['sort_1' => 1, 'sort_3' => -1];

usort($array, function ($a, $b) use ($fields) {

    foreach ($fields as $field => $direction) {

        $result = $a[$field] <=> $b[$field];

        return $result * $direction;
    }

    return 0;
});

В $fields указываете какие поля и в каком направлении сортировать (1 - по возрастанию, -1 - по убыванию).
Таким образом вы можете сортировать по разным полям в разном направлении.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы