中文排序问题


这怎么排序呢 用传统sort不管用

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 20

如果是我, 就添加一个排序字段, 将中文转换为数字, 然后排序

order by field(column_name, ‘a1’, ‘a3’, ‘a2’); 这也可以排序, 你这种情况, 不推荐用这个方法

file

8个月前 评论
晏南风 (楼主) 8个月前
kis龍 (作者) 8个月前

先把 * 什么部 用正则匹配成数字,再用collect 排序

8个月前 评论
mouyong

file

粘贴个截图过来。

8个月前 评论
晏南风 (楼主) 8个月前
LOST 8个月前
clyde-cn

1、如果数据不多 添加的时候就排好序 2、如果添加的人不可控那就加排序字段

8个月前 评论
order by convert(field using gbk) collate gbk_chinese_ci asc
8个月前 评论
晏南风 (楼主) 8个月前
一缕清风 (作者) 8个月前
陈先生
$array = [
    "一单元六层",
    "一单元一层",
    "一单元三层",
    "一单元五层",
    "一单元七层",
    "一单元四层",
    "一单元八层",
    "一单元二层",
];

function chineseNumberToInteger($chineseNumber)
{
    $numbers = array('零', '一', '二', '三', '四', '五', '六', '七', '八', '九');
    $helpers = array('', '十', '百', '千', '万');
    $value = 0;

    foreach ($numbers as $key => $number) {
        if (strpos($chineseNumber, $number) !== false) {
            $numberLength = mb_strlen($number);
            $chineseNumber = str_replace($number, $key, $chineseNumber);
        }
    }
    foreach ($helpers as $key => $helper) {
        if (strpos($chineseNumber, $helper) !== false) {
            $helperLength = mb_strlen($helper);
            $chineseNumber = str_replace($helper, $key, $chineseNumber);
        }
    }
    for ($i = 0; $i < mb_strlen($chineseNumber); $i++) {
        $value += mb_substr($chineseNumber, $i, 1) * pow(10, $i);
    }
    return $value;
}

usort($array, function ($a, $b) {
    $a = explode("单元", $a);
    $b = explode("单元", $b);

    $aUnit = chineseNumberToInteger($a[0]);
    $aFloor = chineseNumberToInteger(rtrim($a[1], '层'));

    $bUnit = chineseNumberToInteger($b[0]);
    $bFloor = chineseNumberToInteger(rtrim($b[1], '层'));

    if ($aUnit === $bUnit) {
        return $aFloor - $bFloor;
    } else {
        return $aUnit - $bUnit;
    }
});

dd($array);

我不清楚你为什么会考虑使用中文排序,这是一个很 幼稚 的行为,你应该考虑的不是怎么给中文排序,而是怎么样才可以不使用中文来排序!

8个月前 评论
Anything 8个月前
Anything 8个月前

最后借助gpt实现了

 function chineseNumericSort($a, $b)
    {
        // 将中文数字替换为阿拉伯数字
        $chineseToNumber = [
            '一' => 1,
            '二' => 2,
            '三' => 3,
            '四' => 4,
            '五' => 5,
            '六' => 6,
            '七' => 7,
            '八' => 8,
            '九' => 9,
            '十' => 10,
        ];

        $a = preg_replace_callback('/[\x{4e00}-\x{9fa5}]+/u', function($match) use ($chineseToNumber) {
            $number = 0;
            $chineseArray = preg_split('//u', $match[0], -1, PREG_SPLIT_NO_EMPTY);
            foreach ($chineseArray as $chinese) {
                if (isset($chineseToNumber[$chinese])) {
                    $number = $number * 10 + $chineseToNumber[$chinese];
                }
            }
            return $number;
        }, $a['dept_name']);

        $b = preg_replace_callback('/[\x{4e00}-\x{9fa5}]+/u', function($match) use ($chineseToNumber) {
            $number = 0;
            $chineseArray = preg_split('//u', $match[0], -1, PREG_SPLIT_NO_EMPTY);
            foreach ($chineseArray as $chinese) {
                if (isset($chineseToNumber[$chinese])) {
                    $number = $number * 10 + $chineseToNumber[$chinese];
                }
            }
            return $number;
        }, $b['dept_name']);

        return (int)$a - (int)$b;
    }

  usort($list, 'chineseNumericSort');

最终结果

file

8个月前 评论
claystone 8个月前

这个不是靠一串代码能解决的,优先匹配 xx+数字 分开匹配分开排序才是硬道理, 前面相同,进行截取替换 找阿拉伯数字替换中文数字这串,将前面xx分组排序后 再进行数字排序

8个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!