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下利用header()函数设置浏览器缓存的代码
Sep 01 PHP
基于PHP开发中的安全防范知识详解
Jun 06 PHP
基于PHP CURL用法的深入分析
Jun 09 PHP
国外十大最流行的PHP框架排名
Jul 04 PHP
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
Feb 24 PHP
PHP生成压缩文件实例
Feb 07 PHP
php操作memcache缓存方法分享
Jun 03 PHP
Zend Framework动作助手Redirector用法实例详解
Mar 05 PHP
PHP 与 UTF-8 的最佳实践详细介绍
Jan 04 PHP
PHP生成图片缩略图类示例
Jan 12 PHP
PHP 7.4 新语法之箭头函数实例详解
May 09 PHP
php解析非标准json、非规范json的方式实例
Dec 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函数eval()介绍和使用示例
2014/08/20 PHP
PHP简单获取视频预览图的方法
2015/03/12 PHP
java微信开发之上传下载多媒体文件
2016/06/24 PHP
Yii实现文章列表置顶功能示例
2016/10/18 PHP
php进程daemon化的正确实现方法
2018/09/06 PHP
js window.event对象详尽解析
2009/02/17 Javascript
JavaScript中的稀疏数组与密集数组[译]
2012/09/17 Javascript
轻松创建nodejs服务器(8):非阻塞是如何实现的
2014/12/18 NodeJs
javascript判断数组内是否重复的方法
2015/04/21 Javascript
JS实现简易刻度时钟示例代码
2017/03/11 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
jquery中attr、prop、data区别与用法分析
2019/09/25 jQuery
JS浏览器BOM常见操作实例详解
2020/04/27 Javascript
如何在vue 中使用柱状图 并自修改配置
2021/01/21 Vue.js
vue中h5端打开app(判断是安卓还是苹果)
2021/02/26 Vue.js
[03:02]安得倚天剑,跨海斩长鲸——中国军团出征DOTA2国际邀请赛
2018/08/14 DOTA
python获取目录下所有文件的方法
2015/06/01 Python
Python3利用SMTP协议发送E-mail电子邮件的方法
2017/09/30 Python
利用python的socket发送http(s)请求方法示例
2018/05/07 Python
在python带权重的列表中随机取值的方法
2019/01/23 Python
django中ORM模型常用的字段的使用方法
2019/03/05 Python
Python交互式图形编程的实现
2019/07/25 Python
Django 解决新建表删除后无法重新创建等问题
2020/05/21 Python
Python smtp邮件发送模块用法教程
2020/06/15 Python
Python StringIO及BytesIO包使用方法解析
2020/06/15 Python
python解释器安装教程的方法步骤
2020/07/02 Python
Python基于callable函数检测对象是否可被调用
2020/10/16 Python
HTML5学习心得总结(推荐)
2016/07/08 HTML / CSS
优衣库澳大利亚官网:UNIQLO澳大利亚
2017/01/18 全球购物
Rhone官方网站:男士运动服装、健身服装和高级运动服
2019/05/01 全球购物
揭牌仪式主持词
2014/03/19 职场文书
家长通知书家长评语
2014/04/17 职场文书
房地产置业顾问岗位职责
2015/04/11 职场文书
黄河绝恋观后感
2015/06/08 职场文书
歼十出击观后感
2015/06/11 职场文书
python开发实时可视化仪表盘的示例
2021/05/07 Python