您的排序要求:
- 排序数组中未找到的值位于找到的值之前。
- 然后:
- 根据它们在排序数组中的位置对找到的值进行排序
- 在排序数组中正常/升序排序未找到的值
翻转您的订单查找数组将提高效率,同时在关键字搜索之前进行处理比在 php 中搜索值更快。
代码:(Demo)
$array = ['val1', 'val2', 200, 179, 230, 234, 242];
$order = [230, 234, 242, 179, 100];
$keyedOrder = array_flip($order); // for efficiency
usort($array, function($a, $b) use ($keyedOrder) {
return [$keyedOrder[$a] ?? -1, $a]
<=>
[$keyedOrder[$b] ?? -1, $b];
});
var_export($array);
输出:
array (
0 => 'val1',
1 => 'val2',
2 => 200,
3 => 230,
4 => 234,
5 => 242,
6 => 179,
)
$keyedOrder[$variable] ?? -1 实际上意味着如果在查找中找不到该值,则使用-1 将项目定位在查找数组中的最小值之前(0)。如果在查找中找到该值作为键,则在查找中使用分配给该键的整数值。
从PHP7.4开始,可以使用箭头函数语法使sn-p更加简洁,避免use()声明。
Demo
usort($array, fn($a, $b) => [$keyedOrder[$a] ?? -1, $a] <=> [$keyedOrder[$b] ?? -1, $b]);