сортировка php-массива в случае, если он exsit в другом массиве

$a= [ '1' => ['key'=>'1','id'=>'4' ], '2' => ['key'=>'2','id'=>'1' ], '3' => ['key'=>'3','id'=>'5' ] ] $b = [1,5] 

поэтому я хочу сортировать массив $a так что если $a[*]['id'] находится в массиве $b он должен быть первым.

поэтому в этом примере выход должен быть

 $a = ['2' => ['key'=>'2','id'=>'1' ], '3' => ['key'=>'3','id'=>'5' ] '1' => ['key'=>'1','id'=>'4' ], ] 

Я пытался

 uasort($a, function($k, $v) use ($b) { return in_array($v['id'],$b) ? 1 : -1; }); 

но не удалось 🙁

есть ли оптимальный метод для выполнения такой трюки с использованием любой из функций сортировки php?

 uasort($a, function ($x, $y) use ($b) { return !in_array($x['id'], $b); }); 

Вы должны заметить, что $y не используется, и код будет работать без ссылки на него, но я предпочитаю этот способ для полноты.

X и Y – любые два значения массива. Если функция сортировки возвращает 1, X помещается последним (первый Y, последний X). Если возвращает -1, X идет первым (первый X, последний Y).

В этом случае функция сортировки вернет true (эквивалентно 1), если $x[id] не находится в $b , поэтому порядок будет первым Y, а затем X. Этот вид переместит в последние позиции все значения массива whit id не в $b .

После этого вы также можете использовать этот код без $y :

 uasort($a, function ($x) use ($b) { return !in_array($x['id'], $b); }); 

Вот еще одна реализация

 $a= array( '1' => array('key'=>'1','id'=>'4' ), '2' => array('key'=>'2','id'=>'1' ), '3' => array('key'=>'3','id'=>'5' ) ); $b = array(1,5); asort($a); function customuksort($t1, $t2) { global $a; return $a[$t1] < $a[$t2] ? -1 : 1; } uksort($b, 'customuksort'); print_r($a); 

Выход

 Array ( [1] => Array ( [key] => 1 [id] => 4 ) [2] => Array ( [key] => 2 [id] => 1 ) [3] => Array ( [key] => 3 [id] => 5 ) )