PHP 二维数组根据某个key中文排序

56 阅读1分钟

数组:

    $students = array(  
    array(  
        'id' => 2130,  
        'new_xuezhe_name' => '黄灿',  
        'new_xuezhe_country' => '中国'  
    ),  
    array(  
        'id' => 2107,  
        'new_xuezhe_name' => '陈劲',  
        'new_xuezhe_country' => '中国'  
    ),  
    array(  
        'id' => 2125,  
        'new_xuezhe_name' => 'Mats Magnusson',  
        'new_xuezhe_country' => 'Sweden',  
        'new_xuezhe_title' => 'Professor and Vice Head of School'  
    ),  
    array(  
        'id' => 2110,  
        'new_xuezhe_name' => 'John Bessant',  
        'new_xuezhe_country' => 'England'  
    )  
);  

需求: 根据 new_xuezhe_name 这个key 使中文排在前面,英文排在后面,并且使中文按照abc 这样排序,比如上面的数组, 陈劲应该在前面黄灿在后面。

处理方法:

// 自定义排序函数  
function sortStudentsByName($a, $b) {  
    // 提取名字  
    $nameA = $a['new_xuezhe_name'];  
    $nameB = $b['new_xuezhe_name'];  
  
    // 检查名字是否为中文  
    $isChineseA = preg_match('/[\x{4e00}-\x{9fa5}]/u', $nameA);  
    $isChineseB = preg_match('/[\x{4e00}-\x{9fa5}]/u', $nameB);  
  
    // 如果两个都是中文,按字母顺序比较  
    if ($isChineseA && $isChineseB) {  
        return strcmp($nameA, $nameB);  
    }  
    // 如果一个中文一个非中文,中文排在前面  
    elseif ($isChineseA) {  
        return -1;  
    }  
    elseif ($isChineseB) {  
        return 1;  
    }  
    // 如果两个都不是中文,也按字母顺序比较  
    else {  
        return strcmp($nameA, $nameB);  
    }  
}  
// 使用usort进行排序  
usort($students, 'sortStudentsByName');  
  
// 输出排序后的数组  
echo '<pre>';
print_r($students);

结果如下:

Array
(
    [0] => Array
        (
            [id] => 2107
            [new_xuezhe_name] => 陈劲
            [new_xuezhe_country] => 中国
        )

    [1] => Array
        (
            [id] => 2130
            [new_xuezhe_name] => 黄灿
            [new_xuezhe_country] => 中国
        )

    [2] => Array
        (
            [id] => 2110
            [new_xuezhe_name] => John Bessant
            [new_xuezhe_country] => England
        )

    [3] => Array
        (
            [id] => 2125
            [new_xuezhe_name] => Mats Magnusson
            [new_xuezhe_country] => Sweden
            [new_xuezhe_title] => Professor and Vice Head of School
        )

)