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


Posted in PHP onMay 09, 2017

本文实例讲述了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(emptyempty($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] => 浙江西子宾馆
    )
)

完全正确,搞定了~

PHP 相关文章推荐
用PHP实现验证码功能
Oct 09 PHP
再次研究下cache_lite
Feb 14 PHP
Mysql的GROUP_CONCAT()函数使用方法
Mar 28 PHP
php在线打包程序源码
Jul 27 PHP
10个可以简化php开发过程的MySQL工具
Apr 11 PHP
PHP实现格式化文件数据大小显示的方法
Jan 03 PHP
使用URL传输SESSION信息
Jul 14 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
Aug 21 PHP
在openSUSE42.1下编译安装PHP7 的方法
Dec 24 PHP
Symfony2框架学习笔记之表单用法详解
Mar 18 PHP
完美解决Thinkphp3.2中插入相同数据的问题
Aug 01 PHP
Laravel监听数据库访问,打印SQL的例子
Oct 24 PHP
php7 安装yar 生成docker镜像
May 09 #PHP
php简单生成一组与多组随机字符串的方法
May 09 #PHP
PHP实现上传多图即时显示与即时删除的方法
May 09 #PHP
Laravel中如何增加自定义全局函数详解
May 09 #PHP
laravel 5.3中自定义加密服务的方案详解
May 09 #PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
May 09 #PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
May 08 #PHP
You might like
php cookies中删除的一般赋值方法
2011/05/07 PHP
LotusPhp笔记之:Cookie组件的使用详解
2013/05/06 PHP
ubuntu12.04使用c编写php扩展模块教程分享
2013/12/25 PHP
php+mysql数据库实现无限分类的方法
2014/12/12 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
2017/02/25 PHP
PHP用正则匹配form表单中所有元素的类型和属性值实例代码
2017/02/28 PHP
PHP中十六进制颜色与RGB颜色值互转的方法
2019/03/18 PHP
PHP array_reverse() 函数原理及实例解析
2020/07/14 PHP
在网页里看flash的trace数据的js类
2009/01/10 Javascript
jQuery提交多个表单的小例子
2013/06/30 Javascript
js通过location.search来获取页面传来的参数
2014/09/11 Javascript
扒一扒JavaScript 预解释
2015/01/28 Javascript
JavaScript简单下拉菜单实例代码
2015/09/07 Javascript
jquery实现用户登陆界面(示例讲解)
2017/09/06 jQuery
浅谈Vue开发人员的7个最好的VSCode扩展
2021/01/20 Vue.js
JavaScript实现点击自制菜单效果
2021/02/02 Javascript
python中的函数用法入门教程
2014/09/02 Python
Python heapq使用详解及实例代码
2017/01/25 Python
Python实现将文本生成二维码的方法示例
2017/07/18 Python
详解K-means算法在Python中的实现
2017/12/05 Python
Python中getpass模块无回显输入源码解析
2018/01/11 Python
python3 selenium 切换窗口的几种方法小结
2018/05/21 Python
python 标准差计算的实现(std)
2019/07/29 Python
利用python 下载bilibili视频
2020/11/13 Python
Pycharm 设置默认解释器路径和编码格式的操作
2021/02/05 Python
关于HTML5语义标签的实践(blog页面)
2016/07/12 HTML / CSS
护理专业的自荐信
2013/10/22 职场文书
优秀员工获奖感言
2014/03/01 职场文书
现金出纳岗位职责
2014/03/15 职场文书
党员应该树立反腐倡廉的坚定意识思想汇报
2014/09/12 职场文书
归元寺导游词
2015/02/06 职场文书
美丽心灵观后感
2015/06/01 职场文书
2015中学教学工作总结
2015/07/22 职场文书
四则混合运算教学反思
2016/02/23 职场文书
Golang之sync.Pool使用详解
2021/05/06 Golang
阿里云服务器搭建Php+Apache运行环境的详细过程
2021/05/15 PHP