У меня есть следующий массив, который мне нужно отсортировать по имени ([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
)
)
Большое вам спасибо за помощь.
Вы можете использовать функцию usort
как
usort($arr, function($a,$b){
$c = strcmp($a[0],$b[0]);
$c .= strcmp($a[2],$b[2]);
return $c;
});
Вам понадобится 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);
Я полагаю, вы хотите, чтобы он отсортировался сначала по названию, а затем по платформе? (В вашем примере есть все те же заголовки, чтобы не было понятно)
Логично, что это ничем не отличается от сортировки его одной длинной фразой, содержащей название и платформу, поэтому вы должны иметь возможность сортировать ее путем их конкатенации.
function sort_by_name($a, $b) {
if ($a == $b)
return 0;
return (($a[0] . $a[2]) < ($b[0] . $b[2])) ? -1 : 1;
}
Конечно, это зависит от того, что заголовок точно задан в каждом экземпляре (включая пробелы, капитализацию и т.д.), Но у вас это было бы в любом виде
Взгляните на array_multisort()
Короче говоря, вы создаете два массива из значений, которые хотите отсортировать, и передайте их в array_multi_sort()