根据列值对二维数组的行进行排序(不区分大小写),然后区分大小写

问题描述 投票:0回答:2

我有以下数组项:

$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()
有什么用处?

php arrays sorting case-sensitive custom-sort
2个回答
0
投票

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;
});

0
投票

首先不区分大小写进行比较,然后区分大小写来打破平局。

?:
是 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',
  ),
)
© www.soinside.com 2019 - 2024. All rights reserved.