`
远去的渡口
  • 浏览: 467893 次
  • 性别: Icon_minigender_2
  • 来自: 上海转北京
社区版块
存档分类
最新评论

php里获取第一个中文首字母并排序

    博客分类:
  • PHP
阅读更多

很久没来更新博客了,还是觉得工作需要多总结的好。今天来更新一个自己认为比较有成就的问题吧。
最近在做储值结算,需求里结算首页需要按门店的首字母A-Z排序。我的数据结构原本是这样的:

Array
(
    [0] => Array
        (
            [sid] => 2885842
            [recetcstoredpay] => 24000
            [recetclprinciple] => 23465
            [paytcstoredpay] => 5455
            [paytclprinciple] => 34900
            [sname] => 百宴餐饮---便宜坊烤鸭店
        )

    [1] => Array
        (
            [sid] => 3644191
            [recetcstoredpay] => 89200
            [recetclprinciple] => 406930
            [paytcstoredpay] => 4090
            [paytclprinciple] => 97800
            [sname] => 大长秋餐饮中心
        )

    [2] => Array
        (
            [sid] => 5229673
            [recetcstoredpay] => 26000
            [recetclprinciple] => 45930
            [paytcstoredpay] => 24795
            [paytclprinciple] => 121800
            [sname] => 大众点评网
        )

    [3] => Array
        (
            [sid] => 3715927
            [recetcstoredpay] => 13600
            [recetclprinciple] => 56930
            [paytcstoredpay] => 5710
            [paytclprinciple] => 37800
            [sname] => 江东北路店
        )

    [4] => Array
        (
            [sid] => 3671092
            [recetcstoredpay] => 1280
            [recetclprinciple] => 46930
            [paytcstoredpay] => 128090
            [paytclprinciple] => 149800
            [sname] => 金凤区新馆
        )

    [5] => Array
        (
            [sid] => 1858783
            [recetcstoredpay] => 2040
            [recetclprinciple] => 4465
            [paytcstoredpay] => 245
            [paytclprinciple] => 4900
            [sname] => 浙江西子宾馆
        )

    [6] => Array
        (
            [sid] => 16832117
            [recetcstoredpay] => 81600
            [recetclprinciple] => 470930
            [paytcstoredpay] => 506090
            [paytclprinciple] => 8000
            [sname] => 欢乐谷店
        )

)

 根据需求,要根据sname的第一个汉字首字母排序,那么就先需要写一个取首字母的方法:

 /**
     * 取汉字的第一个字的首字母
     * @param type $str
     * @return string|null
     */
    public function _getFirstCharter($str){
	if(empty($str)){return '';}
	$fchar=ord($str{0});
	if($fchar>=ord('A')&&$fchar<=ord('z')) return strtoupper($str{0});
	$s1=iconv('UTF-8','gb2312',$str);
	$s2=iconv('gb2312','UTF-8',$s1);
	$s=$s2==$str?$s1:$str;
	$asc=ord($s{0})*256+ord($s{1})-65536;
	if($asc>=-20319&&$asc<=-20284) return 'A';
	if($asc>=-20283&&$asc<=-19776) return 'B';
	if($asc>=-19775&&$asc<=-19219) return 'C';
	if($asc>=-19218&&$asc<=-18711) return 'D';
	if($asc>=-18710&&$asc<=-18527) return 'E';
	if($asc>=-18526&&$asc<=-18240) return 'F';
	if($asc>=-18239&&$asc<=-17923) return 'G';
	if($asc>=-17922&&$asc<=-17418) return 'H';
	if($asc>=-17417&&$asc<=-16475) return 'J';
	if($asc>=-16474&&$asc<=-16213) return 'K';
	if($asc>=-16212&&$asc<=-15641) return 'L';
	if($asc>=-15640&&$asc<=-15166) return 'M';
	if($asc>=-15165&&$asc<=-14923) return 'N';
	if($asc>=-14922&&$asc<=-14915) return 'O';
	if($asc>=-14914&&$asc<=-14631) return 'P';
	if($asc>=-14630&&$asc<=-14150) return 'Q';
	if($asc>=-14149&&$asc<=-14091) return 'R';
	if($asc>=-14090&&$asc<=-13319) return 'S';
	if($asc>=-13318&&$asc<=-12839) return 'T';
	if($asc>=-12838&&$asc<=-12557) return 'W';
	if($asc>=-12556&&$asc<=-11848) return 'X';
	if($asc>=-11847&&$asc<=-11056) return 'Y';
	if($asc>=-11055&&$asc<=-10247) return 'Z';
	return null;
    }

 然后下一步,要对这个二维数据排序。我思考了很久,后来想到了方案,先在循环里调用这个取首字母的方法,然后以这个字母作为key,因为php里有根据key排序的方法,所以我的代码写成这样就搞定了:

 //门店名称
            $shopData = $this->_shopNamesArray;  
            
            //根据门店名称第一个汉字的首字母正序排序
            $settles = $result['data'];
       
            $settlesRes = array();
            foreach ($settles as $sett) {
                $sname = $shopData[$sett['sid']];
                $sett['sname'] = $sname;  
                $snameFirstChar = $this->_getFirstCharter($sname); //取出门店的第一个汉字的首字母
                $settlesRes[$snameFirstChar] = $sett;//以这个首字母作为key
            }            
            ksort($settlesRes); //对数据进行ksort排序,以key的值升序排序
                

 先把这些数据print出来看效果:

Array
(
    [B] => Array
        (
            [sid] => 2885842
            [recetcstoredpay] => 24000
            [recetclprinciple] => 23465
            [paytcstoredpay] => 5455
            [paytclprinciple] => 34900
            [sname] => 百宴餐饮---便宜坊烤鸭店
        )

    [D] => Array
        (
            [sid] => 5229673
            [recetcstoredpay] => 26000
            [recetclprinciple] => 45930
            [paytcstoredpay] => 24795
            [paytclprinciple] => 121800
            [sname] => 大众点评网
        )

    [H] => Array
        (
            [sid] => 16832117
            [recetcstoredpay] => 81600
            [recetclprinciple] => 470930
            [paytcstoredpay] => 506090
            [paytclprinciple] => 8000
            [sname] => 欢乐谷店
        )

    [J] => Array
        (
            [sid] => 3671092
            [recetcstoredpay] => 1280
            [recetclprinciple] => 46930
            [paytcstoredpay] => 128090
            [paytclprinciple] => 149800
            [sname] => 金凤区新馆
        )

    [Z] => Array
        (
            [sid] => 1858783
            [recetcstoredpay] => 2040
            [recetclprinciple] => 4465
            [paytcstoredpay] => 245
            [paytclprinciple] => 4900
            [sname] => 浙江西子宾馆
        )

)

 完全正确,搞定了~

分享到:
评论
1 楼 eyuxiog 2016-06-21  
$shopData = $this->_shopNamesArray;   
这块怎么写的   看下这个方法所属类的代码吗
谢谢

相关推荐

    PHP实现获取第一个中文首字母并进行排序的方法

    主要介绍了PHP实现获取第一个中文首字母并进行排序的方法,涉及php数组遍历、编码转换及数组排序相关操作技巧,需要的朋友可以参考下

    php实现快速排序的三种方法分享

    写了三种php快速排示例,第一种效率低但最简单最容易理解,第二个是算法导论上提供的单向一次遍历找中值方法,第三种是双向遍历找中值经典快排算法。三组算法实现和比较如下:方法一:该方法比较直观,但损失了大量...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例128 获取数组中最后一个元素 158 实例129 去除数组中的重复元素 158 实例130 字符串与数组的转换 159 实例131 对数组元素进行随机排序 160 实例132 随机抽取数组中元素 161 实例133 二维数组的输出 162 实例134 ...

    PHP开发实战1200例源码

    目录 第1篇 基础篇 第1章 开发环境 2 1.1 AppServ——PHP集成化安装包 3 实例001 通过AppServ配置PHP开发环境 3 实例002 AppServ应用技巧 6 实例003 第1个PHP程序 7 1.2 XAMPP——PHP集成化安装包 8 实例004 通过...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例128 获取数组中最后一个元素 158 实例129 去除数组中的重复元素 158 实例130 字符串与数组的转换 159 实例131 对数组元素进行随机排序 160 实例132 随机抽取数组中元素 161 实例133 二维数组的输出 162 实例134 ...

    PHP程序开发范例宝典III

    实例227 使用聚集函数First或Last求数据表中第一条或最后一条记录 352 8.10 多表查询 354 实例228 使用select语句进行多表查询 354 实例229 使用表的别名 355 实例230 合并多个结果集 356 8.11 嵌套查询...

    Excel百宝箱8.0

    【字母大小写转换】:将选区的单词、字母在大写小写、首字母大写之间转换 【小写金额转大写】:将小写金额批量转换成大写 【大写金额转小写】:将大写金额批量转换成小写 【区域数据加密】:对工作表选区的数据进行...

    苹果8XPC和手机二合一完整版

    每个模版都可定义不同的样式,所以系统内置的功能的相关文件也都放在了模版里,每个模版里存储一份,避免替换系统目录下的其他文件。 ads/ 存放广告js文件,可自定义名称, 在当前模版路径的config.xml 里配置好 ...

    超实用的jQuery代码段

    9.17 按照首字母进行元素排序 9.18 获取URL地址的Hash参数 9.19 避免多行文本溢出的算法 9.20 随机选择一个元素 9.21 替换&bnsp;空字符的方法 9.22 序列化表单到JSON数据 9.23 获取页面加载时间 9.24 将单个句子...

    KODExplorer 芒果云-资源管理器

    则修改第一行:"name":"admin","password":"21232f297a57a5a743894a0e4a801fc3" ![](https://cloud.githubusercontent.com/assets/3761968/2583304/764f562a-b9cf-11e3-8e59-afdbdffc20eb.png) ###ver2.61 `...

    易化的Python-易语言

    是否全大写文本_是否全字母文本_标题化文本_首字母转大写文本_到小写文本_到大写文本_大小写字符到小写文本_大小写翻转文本_拼接文本_居中文本_左对齐文本_右对齐文本_右对齐0文本_删左边全部空格文本_删右边全部...

Global site tag (gtag.js) - Google Analytics