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连接Access数据库的方法小结
Jun 20 PHP
php检测用户是否用手机(Mobile)访问网站的类
Jan 09 PHP
php的dl函数用法实例
Nov 06 PHP
PHP中使用循环实现的金字塔图形
Nov 08 PHP
支持中文的PHP按字符串长度分割成数组代码
May 17 PHP
PHP将URL转换成短网址的算法分享
Sep 13 PHP
PHP生成唯一ID之SnowFlake算法
Dec 17 PHP
php7安装mongoDB扩展的方法分析
Aug 02 PHP
php连接MSsql server的五种方法总结
Mar 04 PHP
PHP重置数组为连续数字索引的几种方式总结
Mar 12 PHP
PHP检查端口是否可以被绑定的方法示例
Aug 09 PHP
PHP RabbitMQ消息列队
May 11 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操作xml代码
2010/06/17 PHP
PHP URL参数获取方式的四种例子
2014/02/28 PHP
PHP测试成功的邮件发送案例
2015/10/26 PHP
PHP+HTML+JavaScript+Css实现简单爬虫开发
2016/03/28 PHP
php 自定义错误日志实例详解
2016/11/12 PHP
学习ExtJS Column布局
2009/10/08 Javascript
基于jQuery的获取标签名的代码
2012/07/16 Javascript
直接在JS里创建JSON数据然后遍历使用
2014/07/25 Javascript
jquery实现像栅栏一样左右滑出式二级菜单效果代码
2015/08/24 Javascript
深入理解jQuery之防止冒泡事件
2016/05/24 Javascript
json实现添加、遍历与删除属性的方法
2016/06/17 Javascript
微信小程序 火车票查询实例讲解
2016/10/17 Javascript
Chrome调试折腾记之JS断点调试技巧
2017/09/11 Javascript
Node.js自定义实现文件路由功能
2017/09/22 Javascript
Vue响应式原理深入解析及注意事项
2017/12/11 Javascript
Angular 4.x+Ionic3踩坑之Ionic3.x pop反向传值详解
2018/03/13 Javascript
JavaScript数组常用的增删改查与其他属性详解
2020/10/13 Javascript
CentOS 8.2服务器上安装最新版Node.js的方法
2020/12/16 Javascript
Python模拟三级菜单效果
2017/09/11 Python
python 脚本生成随机 字母 + 数字密码功能
2018/05/26 Python
Python中偏函数用法示例
2018/06/07 Python
Django框架用户注销功能实现方法分析
2019/05/28 Python
8种用Python实现线性回归的方法对比详解
2019/07/10 Python
python opencv将图片转为灰度图的方法示例
2019/07/31 Python
pytorch如何冻结某层参数的实现
2020/01/10 Python
python 数据分析实现长宽格式的转换
2020/05/18 Python
python如何使用代码运行助手
2020/07/03 Python
使用Python项目生成所有依赖包的清单方式
2020/07/13 Python
PyQt5的相对布局管理的实现
2020/08/07 Python
python 爬取腾讯视频评论的实现步骤
2021/02/18 Python
建筑公司文秘岗位职责
2013/11/29 职场文书
简历中求职的个人自我评价
2013/12/03 职场文书
《埃及的金字塔》教学反思
2014/04/07 职场文书
食品安全标语
2014/06/07 职场文书
如何理解python接口自动化之logging日志模块
2021/06/15 Python
Java设计模式之享元模式示例详解
2022/03/03 Java/Android