Because it is not performant to call two or more functions on each iteration of uasort() AND because array_multisort() will not preserve numeric keys, I have devised a script to minimize iterated function calls and separately preserve keys while using array_multisort().
Code: (Demo)
$firsts = [];
$lasts = [];
$keys = [];
foreach ($array as $keys[] => $v) {
[$firsts[], $lasts[]] = preg_split('/.*\K |^/', $v);
}
array_multisort($lasts, $firsts, $keys, $array);
var_export(array_combine($keys, $array));
The above script populates separate (equally sized) arrays for first names, last names and original keys.
The regular expression splits on the last occurring space OR if that doesn't exist, it splits on the position before the first character (meaning the first name value will be blank).
array_multisort() will sort by last names ASC, then first names ASC, then keys ASC (but by this point there will be no ties to break), then the full name values ASC (but again, there will be no ties to break).
array_combine() is called to re-associate the keys with their original values in their new positions.