配列の深さがわかっている場合は、並べ替える各配列要素にusortを適用するだけです。
カスタム配列に従って注文する例を次に示します。
<?php
$order = array(
'first',
'second',
'third',
'fourth',
'fifth'
);
$array = array(
array(
'second',
'fourth',
'first',
'third'
),
array(
'second',
'first'
)
);
foreach($array as &$value) {
usort($value, function($a, $b) use($order) {
return array_search($a, $order) > array_search($b, $order);
});
}
unset($value);
var_dump($array);
/*
array(2) {
[0]=>
array(4) {
[0]=>
string(5) "first"
[1]=>
string(6) "second"
[2]=>
string(5) "third"
[3]=>
string(6) "fourth"
}
[1]=>
array(2) {
[0]=>
string(5) "first"
[1]=>
string(6) "second"
}
}
*/
配列がどれだけ深くなるかわからない場合、私の頭に浮かぶ唯一の解決策は再帰関数です。
<?php
$order = array(
'first',
'second',
'third',
'fourth',
'fifth'
);
$array = array(
array(
'second',
'fourth',
'first',
'third'
),
array(
array('second', 'first'),
array('fourth', 'third')
)
);
function custom_multisort($array, $order) {
foreach($array as &$value) {
if(is_array($value[0])) {
$value = custom_multisort($value, $order);
} else {
usort($value, function($a, $b) use($order) {
return array_search($a, $order) > array_search($b, $order);
});
}
}
return $array;
}
$array = custom_multisort($array, $order);
var_dump($array);
/*
array(2) {
[0]=>
array(4) {
[0]=>
string(5) "first"
[1]=>
string(6) "second"
[2]=>
string(5) "third"
[3]=>
string(6) "fourth"
}
[1]=>
array(2) {
[0]=>
array(2) {
[0]=>
string(5) "first"
[1]=>
string(6) "second"
}
[1]=>
array(2) {
[0]=>
string(5) "third"
[1]=>
string(6) "fourth"
}
}
}
*/