我有以下数组项:
$users = [
['first_name' => 'Rebecca'],
['first_name' => 'amy'],
['first_name' => 'Amy'],
['first_name' => 'stacy'],
]
我希望数组根据 first_name 属性按字母顺序排序。在 first_name 属性相同的碰撞中(即
amy
与 Amy
),我希望大写字母的值排在前面。
在上面的数组中,排序后的值应该是:
[
['first_name' => 'Amy'],
['first_name' => 'amy'],
['first_name' => 'Rebecca'],
['first_name' => 'stacy'],
]
这是当前自定义的
usort()
我正在使用:
usort($users, function($a, $b){
$first_name_compare = strcasecmp($a['first_name'], $b['first_name']);
return $first_name_compare;
});
strcasecmp()
据说不区分大小写,但我注意到它不一致。在上面的数组示例中,strcasecmp()
有时会在 amy
之前返回 Amy
,反之亦然。
在此用例中,
strcasecmp()
有什么用处?
当
strcasecmp()
返回 0
时,您应该回到 strcmp()
。
usort($users, function($a, $b){
$first_name_compare = strcasecmp($a['first_name'], $b['first_name']);
if ($first_name_compare == 0) {
$first_name_compare = strcmp($a['first_name'], $b['first_name']);
}
return $first_name_compare;
});
首先不区分大小写进行比较,然后区分大小写来打破平局。
?:
是 Elvis 运算符 - 如果第一次评估中的值为 0(假),则回退到第二次比较的评估。
代码:(演示)
$data = json_decode('[{"first_name":"Rebecca"},{"first_name":"amy"},{"first_name":"Amy"},{"first_name":"stacy"}]', true);
usort(
$data,
fn($a, $b) => strcasecmp($a['first_name'], $b['first_name'])
?: strcmp($a['first_name'], $b['first_name'])
);
var_export($data);
输出:
array (
0 =>
array (
'first_name' => 'Amy',
),
1 =>
array (
'first_name' => 'amy',
),
2 =>
array (
'first_name' => 'Rebecca',
),
3 =>
array (
'first_name' => 'stacy',
),
)