$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 ) )