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
php生成xml简单实例代码
Dec 16 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
Jun 28 PHP
PHP以mysqli方式连接类完整代码实例
Jul 15 PHP
php树型类实例
Dec 05 PHP
PHP模板解析类实例
Jul 09 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
Oct 20 PHP
PHP手机号中间四位用星号*代替显示的实例
Jun 02 PHP
详解php语言最牛掰的Laravel框架
Nov 20 PHP
Laravel框架基于ajax实现二级联动功能示例
Jan 17 PHP
TP5.0框架实现无限极回复功能的方法分析
May 04 PHP
php解压缩zip和rar压缩包文件的方法
Jul 10 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(3) php 函数
2010/02/15 PHP
非常好用的两个PHP函数 serialize()和unserialize()
2012/02/04 PHP
php可应用于面包屑导航的迭代寻找家谱树实现方法
2015/02/02 PHP
PHP使用ajax的post方式下载excel文件简单示例
2019/08/06 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
php7 错误处理机制修改实例分析
2020/05/25 PHP
javascript知识点收藏
2007/02/22 Javascript
jquery入门—选择器实现隔行变色实例代码
2013/01/04 Javascript
在表单提交前进行验证的几种方式整理
2013/07/31 Javascript
javascript:window.open弹出窗口的位置问题
2014/03/18 Javascript
jQuery实现图片上传和裁剪插件Croppie
2015/11/29 Javascript
JavaScript创建对象的方式小结(4种方式)
2015/12/17 Javascript
AngularJS入门教程之服务(Service)
2016/07/27 Javascript
vue实现简单实时汇率计算功能
2017/01/15 Javascript
Bootstrap 3多级下拉菜单实例
2017/11/23 Javascript
vue 全选与反选的实现方法(无Bug 新手看过来)
2018/02/09 Javascript
支付宝小程序tabbar底部导航
2018/11/06 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
2019/05/02 Javascript
关于layui导航栏不展示下拉列表的解决方法
2019/09/25 Javascript
Python实现类继承实例
2014/07/04 Python
[原创]python爬虫(入门教程、视频教程)
2018/01/08 Python
解决python中 f.write写入中文出错的问题
2018/10/31 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
2018/12/20 Python
jupyter 中文乱码设置编码格式 避免控制台输出的解决
2020/04/20 Python
简单掌握CSS3中resize属性的用法
2016/04/01 HTML / CSS
北京麒麟网信息技术有限公司网络游戏测试面试题
2013/09/28 面试题
军训自我鉴定
2013/12/14 职场文书
大一学生的职业生涯规划书范文
2014/01/19 职场文书
贷款委托书怎么写
2014/08/02 职场文书
2014感恩节演讲稿大全
2014/10/11 职场文书
长城导游词
2015/01/30 职场文书
会计求职自荐信
2015/03/26 职场文书
一个家长教育孩子的心得体会
2016/01/15 职场文书
关于Mybatis中SQL节点的深入解析
2022/03/19 Java/Android
sql server偶发出现死锁的解决方法
2022/04/10 SQL Server