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项目开发中最常用的自定义函数整理
Dec 02 PHP
php列出一个目录下的所有文件的代码
Oct 09 PHP
PHP 提取图片img标记中的任意属性的简单实例
Dec 10 PHP
简单实用的网站PHP缓存类实例
Jul 18 PHP
php一行代码获取文件后缀名实例分析
Nov 12 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
Dec 16 PHP
PHP对文件夹递归执行chmod命令的方法
Jun 19 PHP
PHP编写的图片验证码类文件分享
Jun 06 PHP
thinkPHP数据库增删改查操作方法实例详解
Dec 06 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
Aug 25 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
Apr 21 PHP
PHP通过文件路径获取文件名的实例代码
Oct 14 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
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
2013/06/24 PHP
支持png透明图片的php生成缩略图类分享
2015/02/08 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
JavaScript 设计模式之组合模式解析
2010/04/09 Javascript
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
2013/05/21 Javascript
html5的自定义data-*属性和jquery的data()方法的使用示例
2013/08/21 Javascript
js/jquery去掉空格,回车,换行示例代码
2013/11/05 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
href下载文件根据id取url并下载
2014/05/28 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
jQuery实现TAB风格的全国省份城市滑动切换效果代码
2015/08/24 Javascript
Bootstrap三种表单布局的使用方法
2016/06/21 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
2016/12/13 Javascript
浅谈Node.js爬虫之网页请求模块
2018/01/11 Javascript
详解如何在vue项目中使用lodop打印插件
2018/09/27 Javascript
解决axios会发送两次请求,有个OPTIONS请求的问题
2018/10/25 Javascript
详解@Vue/Cli 3 Invalid Host header 错误解决办法
2019/01/02 Javascript
VUE页面中通过双击实现复制表格中内容的示例代码
2020/06/11 Javascript
JavaScript实现多层颜色选项卡嵌套
2020/09/21 Javascript
[19:54]夜魇凡尔赛茶话会 第一期02:看图识人
2021/03/11 DOTA
Python批量修改图片分辨率的实例代码
2019/07/04 Python
Python如何将将模块分割成多个文件
2020/08/04 Python
BabyBjörn婴儿背带法国官网:BabyBjorn法国
2018/06/16 全球购物
30年同学聚会邀请函
2014/01/25 职场文书
公司门卫的岗位职责
2014/02/19 职场文书
《鸟的天堂》教学反思
2014/02/27 职场文书
销售内勤岗位职责
2014/04/15 职场文书
干部考核评语
2014/04/29 职场文书
争先创优活动总结
2014/08/27 职场文书
初中生300字旷课检讨书
2014/11/19 职场文书
机器人瓦力观后感
2015/06/12 职场文书
装修安全责任协议书
2016/03/22 职场文书
2019年聘任书的写作格式及范文!
2019/07/03 职场文书
创业计划书之美甲店
2019/09/20 职场文书
oracle数据库去除重复数据
2022/05/20 Oracle