Сортировать многомерный массив по двум строкам

1

У меня есть следующий массив, который мне нужно отсортировать по имени ([0]) и платформе ([2])

Array
(
[0] => Array
    (
        [0] => Assassins Creed: Syndicate
        [1] => 199
        [2] => PC
        [3] => 1
    )

[1] => Array
    (
        [0] => Assassins Creed: Syndicate
        [1] => 199
        [2] => XONE
        [3] => 1
    )

[2] => Array
    (
        [0] => Assassins Creed: Syndicate
        [1] => 199
        [2] => PC
        [3] => 1
    )
)

У меня уже есть функция usort, которая сортирует массив по имени, но я не знаю, как сортировать его также по платформе (так что xbox будет на последней позиции).

function sort_by_name($a, $b)   {
if ($a == $b)
return 0;
return ($a[0] < $b[0]) ? -1 : 1;
}

Я бы хотел, чтобы массив отсортировался следующим образом:

Array
(
[0] => Array
(
    [0] => Assassins Creed: Syndicate
    [1] => 199
    [2] => PC
    [3] => 1
)
[1] => Array
(
    [0] => Assassins Creed: Syndicate
    [1] => 199
    [2] => PC
    [3] => 1
    )
[2] => Array
(
    [0] => Assassins Creed: Syndicate
    [1] => 199
    [2] => XONE
    [3] => 1
)
)

Большое вам спасибо за помощь.

  • 0
    Каков ваш ожидаемый результат здесь опубликовать его тоже.
  • 0
    Хорошо, я отредактировал свой вопрос. По сути, мне нужна моя функция для сортировки по алфавиту по строке в [0], а также по алфавиту в [2].
Показать ещё 2 комментария
Теги:
arrays
multidimensional-array
sorting

4 ответа

2
Лучший ответ

Вы можете использовать функцию usort как

usort($arr, function($a,$b){
    $c = strcmp($a[0],$b[0]);
    $c .= strcmp($a[2],$b[2]);
    return $c;
});
0

Вам понадобится array_multisort

$sort = array();
foreach($YOUR_ARRAY as $k=>$v) {
    $sort[0][$k] = $v[0];
    $sort[2][$k] = $v[2];
}



array_multisort($sort['0'], SORT_DESC, $sort[2], SORT_ASC, $YOUR_ARRAY);
0

Я полагаю, вы хотите, чтобы он отсортировался сначала по названию, а затем по платформе? (В вашем примере есть все те же заголовки, чтобы не было понятно)

Логично, что это ничем не отличается от сортировки его одной длинной фразой, содержащей название и платформу, поэтому вы должны иметь возможность сортировать ее путем их конкатенации.

function sort_by_name($a, $b)   {
   if ($a == $b)
      return 0;
   return (($a[0] . $a[2]) < ($b[0] . $b[2])) ? -1 : 1;
}

Конечно, это зависит от того, что заголовок точно задан в каждом экземпляре (включая пробелы, капитализацию и т.д.), Но у вас это было бы в любом виде

0

Взгляните на array_multisort()

Короче говоря, вы создаете два массива из значений, которые хотите отсортировать, и передайте их в array_multi_sort()

  • 0
    Не возможно использовать usort?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню