これについていくつか質問がありましたが、ここではかなり特殊なケースがあると感じたので、新しいケースを尋ねています。
最初にユーザーの配列をタイトルの(配列)で並べ替え、次に姓で並べ替える必要があります。次のコードを検討してください。
<?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']);
});
}
必要なのは、のタイトルの最も低いインデックスに基づいてユーザーを並べ替えることです$order
。を使用しarray_search
て、の各タイトルのインデックス$order
を検索し、を使用して最小の番号を検索できますmin
。それらが同じである場合は、にフォールバックしstrcmp
ます。
usort($users, function($a, $b) use ($order) {
$minAPos = min(array_map(function($title) use ($order) {
$pos = array_search($title, $order);
return $pos === false? sizeof($order) : $pos;
}, $a['titles']));
$minBPos = min(array_map(function($title) use ($order) {
$pos = array_search($title, $order);
return $pos === false? sizeof($order) : $pos;
}, $b['titles']));
if($minAPos === $minBPos) {
return strcmp($a['lastName'], $b['lastName']);
} else {
return $minAPos <=> $minBPos;
}
});
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加