Я нашел несколько вопросов по этому поводу, но у меня есть особый случай, поэтому я задаю новый.
Мне нужно сначала отсортировать массив пользователей по их (массиву)названий, а затем по фамилии, рассмотрите следующий код:
<?php
$users = [
[
'lastName' => 'Clarks',
'titles' => ['Manager', 'Supervisor']
],
[
'lastName' => 'Clarkson',
'titles' => ['Sales']
],
[
'lastName' => 'Adams',
'titles' => ['Supervisor']
],
[
'lastName' => 'Adams',
'titles' => ['Manager', 'Senior Manager']
],
[
'lastName' => 'Clarkson',
'titles' => ['Manager']
],
[
'lastName' => 'Davids',
'titles' => ['Senior Manager']
]
];
И порядок, который я хочу:
<?php
$order = [
'Senior Manager',
'Manager',
'Supervisor'
];
Если есть несколько менеджеров, они должны быть отсортированы по lastName,поэтому вывод в этом случае будет:
<?php
$sorted = [
[
'lastName' => 'Adams',
'titles' => ['Manager', 'Senior Manager']
],
[
'lastName' => 'Davids',
'titles' => ['Senior Manager']
],
[
'lastName' => 'Clarks',
'titles' => ['Manager', 'Supervisor']
],
[
'lastName' => 'Clarkson',
'titles' => ['Manager']
],
[
'lastName' => 'Adams',
'titles' => ['Supervisor']
],
[
'lastName' => 'Clarkson',
'titles' => ['Sales']
]
];
Я пробовал что-то в этом духе, но не могу заставить его работать, и мне сложно его отладить usort
:
<?php
foreach ($order as $title) {
usort($users, function ($a, $b) use ($title) {
# Both have the title
if (in_array($title, $a['titles']) and in_array($title, $b['titles']) ) {
# Sort by name
return strcmp($a['lastName'], $b['lastName']);
}
# A has the title
elseif (in_array($title, $a['titles'])) {
return 1;
}
# B has the title
elseif (in_array($title, $b['titles'])) {
return -1;
}
# No-one has the title
return strcmp($a['lastName'], $b['lastName']);
});
}