这天做个页面,需要将图片表里面图片的标签拉出来拆分好后去重按自然排序。结果很囧,应该排序的结果是0-9-A-z-阿-中,但是中文部分就是很乱。再找问题,结果发现自然排序是按照字符编码的顺序来排列。由于当前页面是UTF-8编码,UTF-8大家应该清楚吧,我称为是“电脑码”,给电脑看的~汗…… 如果换成GBK或者GB2312编码就不会这样了,这跟汉字在字符集的编码有关。比如”人”这个字,在GBK和GB2312中就是按它的拼音”ren”的字母顺序排到第N个位置,而UTF-8编码就不是这样了(没有具体研究怎么排的)。OK 知道原因就简单了,排序前将字符转到GBK,排序完了再转回来就OK。
$this->db->select(‘#imgs’,”tags”,”,”);//相当于查询imgs表中所有的tags字段
$tags = $this->db->getAll();//获得查询结果
$tagslist = $tlist = array();
foreach ($tags as $tagarray){
$tag = explode(‘ ‘,$tagarray[‘tags’]);//字段是多个标签组成的字符串,这里分解下
foreach($tag as $t){
if(!in_array($t,$tagslist) && !empty($t)){//去重去空
$t = iconv(‘UTF-8’, ‘GBK’, $t);
$tagslist[] = $t;//得到标签数组,GBK编码
}
}
}
asort($tagslist);//排序数组 ,可以用别的自然排序函数natsort,natcasesort
foreach($tagslist as $list){
$list = iconv( ‘GBK’, ‘UTF-8’,$list);
if(!in_array($list,$tlist)){//转回来仍然要去重
$tlist[]=$list;//这里重新给个数组就是为了获得新的KEY,后面模板输出要用到换行
}
}
自由转载,转载请注明: 转载自WEB开发笔记 www.chhua.com
本文链接地址: PHP数组排序关于按中文拼音排序的问题 http://www.chhua.com/web-note620
评论