php 同时包含中英文的数组按照首字母排序

$arr = explode(' ', '1 11 111 112 12 121 122 a aa aaa aab ab aba abb 阿里 百度 中 中国 中国国 中国中 中中 中中国 中中中');

shuffle($arr); //打乱数组

//collator_sort(collator_create('zh_CN'), $arr);

//usort($arr, function($a, $b) { return strnatcmp($a, $b); });

usort($arr, function($a, $b) { return strcmp($a, $b); });

echo implode(' ',$arr);

ls排序:

1 11 111 112 12 121 122 a aa aaa aab ab aba abb 阿里 百度 中 中国 中国国 中国中 中中 中中国 中中中

collator_sort(zh_CN)排序(类似Windows/Linux桌面文件管理器里的默认按名称上升排列):

1 11 12 111 112 121 122 a aa aaa aab ab aba abb 阿里 百度 中 中国 中国国 中国中 中中 中中国 中中中

strnatcmp排序:

1 11 12 111 112 121 122 a aa aaa aab ab aba abb 中 中中 中中中 中中国 中国 中国中 中国国 百度 阿里

strcmp排序:

1 11 111 112 12 121 122 a aa aaa aab ab aba abb 中 中中 中中中 中中国 中国 中国中 中国国 百度 阿里

区别

使用strcmp字符串比较排序其实就已经能够满足你的需求.
strnatcmp自然排序跟strcmp字符串比较排序主要区别在于数字,strnatcmp处理后的数字元素是由小到大排序,存在大小关系.
而ICU扩展intl里的简体中文排序器collator_sort(zh_CN)排序主要能够根据汉字的拼音进行排序,比如Ali,Baidu,ZhongGuo.感兴趣还可以看下我的这篇文章 PHP利用ICU扩展intl快速实现汉字转拼音以及按拼音首字母分组排序 ,汉字转拼音就一个函数的事:

echo transliterator_transliterate('Any-Latin; Latin-ASCII; Upper()', '中华有为');

//输出 ZHONG HUA YOU WEI

另一种方法

/*
     * 中文和英文数组混杂的排序函数   会不会造成内存垃圾?
     */
    private function utf8_array_asort($array) {
        if(!isset($array) || !is_array($array)) {
            return false;
        }
        $array_english_num = [];
        $array_chinese = [];

        foreach ($array as $v){
            if(mb_detect_encoding($v, array("ASCII",'UTF-8',"GB2312","GBK",'BIG5'))=='ASCII') $array_english_num[]= $v;
            if(mb_detect_encoding($v, array("ASCII",'UTF-8',"GB2312","GBK",'BIG5'))=='UTF-8') $array_chinese[]= $v;
        }
        /*   如果是二维数组  然后用array_multisort即可
            foreach($array as $k=>$v) {
            $array[$k] = iconv('UTF-8', 'GBK//IGNORE',$v);
        }
         */
        foreach($array_chinese as &$v) {
            $v = iconv('UTF-8', 'GBK//IGNORE',$v);
        }
        asort($array_chinese);
        asort($array_english_num);
        foreach($array_chinese as &$v) {
            $v = iconv('GBK', 'UTF-8//IGNORE', $v);
        }

		//由于array_merge不会合并空数组,所以不需要考虑xxx
        return array_merge($array_english_num,$array_chinese);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值