利用PHP獲取漢字首字母并且分組排序詳解
前言
本文主要給大家介紹了關(guān)于PHP獲取漢字首字母并分組排序的相關(guān)內(nèi)容,因經(jīng)常我們?cè)谧鲰?xiàng)目的時(shí)候,會(huì)有按首字母排序的需求 比如: 美團(tuán)的城市選擇 http://www.meituan.com/index/changecity/initiative app中按字母搜索
正題
網(wǎng)上找了各種,不盡人意,于是,自己就寫了一個(gè),分享給大家。
<?php /** * @author Tech */ class Character { /** * 二維數(shù)組根據(jù)首字母分組排序 * @param array $data 二維數(shù)組 * @param string $targetKey 首字母的鍵名 * @return array 根據(jù)首字母關(guān)聯(lián)的二維數(shù)組 */ public function groupByInitials(array $data, $targetKey = 'name') { $data = array_map(function ($item) use ($targetKey) { return array_merge($item, [ 'initials' => $this->getInitials($item[$targetKey]), ]); }, $data); $data = $this->sortInitials($data); return $data; } /** * 按字母排序 * @param array $data * @return array */ public function sortInitials(array $data) { $sortData = []; foreach ($data as $key => $value) { $sortData[$value['initials']][] = $value; } ksort($sortData); return $sortData; } /** * 獲取首字母 * @param string $str 漢字字符串 * @return string 首字母 */ public function getInitials($str) { if (empty($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; } }
項(xiàng)目中直接引入即可,如果需要命名空間,可以自行添加,下面是我們看看怎么用。
// 按首字母排序 $data = [ ['id' => 1, 'area_name' => '山東'], ['id' => 2, 'area_name' => '江蘇'], ['id' => 3, 'area_name' => '安徽'], ['id' => 4, 'area_name' => '福建'], ['id' => 5, 'area_name' => '江西'], ['id' => 6, 'area_name' => '廣東'], ['id' => 7, 'area_name' => '廣西'], ['id' => 8, 'area_name' => '海南'], ['id' => 9, 'area_name' => '河南'], ['id' => 10, 'area_name' => '湖南'], ['id' => 11, 'area_name' => '湖北'], ]; // 初始化,然后調(diào)用分組方法 $data = (new Character)->groupByInitials($data, 'area_name');
下面的結(jié)果是不是你想要的呢,不論是做app還是網(wǎng)頁,都可以用
$data = array( 'A' => array( 0 => array( 'id' => 3, 'area_name' => '安徽', 'initials' => 'A' ) ) , 'F' => array( 0 => array( 'id' => 4, 'area_name' => '福建', 'initials' => 'F' ) ) , 'G' => array( 0 => array( 'id' => 6, 'area_name' => '廣東', 'initials' => 'G' ) , 1 => array( 'id' => 7, 'area_name' => '廣西', 'initials' => 'G' ) ) , 'H' => array( 0 => array( 'id' => 8, 'area_name' => '海南', 'initials' => 'H' ) , 1 => array( 'id' => 9, 'area_name' => '河南', 'initials' => 'H' ) , 2 => array( 'id' => 10, 'area_name' => '湖南', 'initials' => 'H' ) , 3 => array( 'id' => 11, 'area_name' => '湖北', 'initials' => 'H' ) ) , 'J' => array( 0 => array( 'id' => 2, 'area_name' => '江蘇', 'initials' => 'J' ) , 1 => array( 'id' => 5, 'area_name' => '江西', 'initials' => 'J' ) ) , 'S' => array( 0 => array( 'id' => 1, 'area_name' => '山東', 'initials' => 'S' ) ) );
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- php獲取漢字首字母的函數(shù)
- PHP自定義函數(shù)獲取漢字首字母的方法
- php 獲得漢字拼音首字母的函數(shù)
- 使用PHP獲取漢字的拼音(全部與首字母)
- php獲取漢字拼音首字母的方法
- PHP實(shí)現(xiàn)將漢字轉(zhuǎn)換為拼音及獲取詞語首字母的方法
- PHP基于ICU擴(kuò)展intl快速實(shí)現(xiàn)漢字轉(zhuǎn)拼音及按拼音首字母分組排序的方法
- 基于PHP如何把漢字轉(zhuǎn)化為拼音
- php中將漢字轉(zhuǎn)換成拼音的函數(shù)代碼
- PHP漢字轉(zhuǎn)換拼音的函數(shù)代碼
- PHP常用函數(shù)之獲取漢字首字母功能示例
相關(guān)文章
詳解PHP實(shí)現(xiàn)支付寶小程序用戶授權(quán)的工具類
這篇文章主要介紹了詳解PHP實(shí)現(xiàn)支付寶小程序用戶授權(quán)的工具類,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-12-12PHP/Laravel如何通過經(jīng)緯度計(jì)算距離獲取附近商家
實(shí)際開發(fā)中,常常需要獲取用戶附近的商家,本文給大家分享PHP/Laravel通過經(jīng)緯度計(jì)算距離獲取附近商家,感興趣的朋友一起看看吧2023-11-11如何使用純PHP實(shí)現(xiàn)定時(shí)器任務(wù)(Timer)
本文主要介紹了如何使用純PHP實(shí)現(xiàn)純粹的定時(shí)器任務(wù),且能適應(yīng)認(rèn)識(shí)任務(wù)業(yè)務(wù)需求,需要的朋友可以參考下2015-07-07114啦源碼(114la)不能生成地方房產(chǎn)和地方報(bào)刊問題4級(jí)頁面0字節(jié)的解決方法
做了個(gè)網(wǎng)址導(dǎo)航站,用的是114la的源碼,沒想到里面有很多問題,官方也沒出補(bǔ)丁,沒辦法,自己學(xué)著改吧2012-01-01php版微信公眾平臺(tái)之微信網(wǎng)頁登陸授權(quán)示例
這篇文章主要介紹了php版微信公眾平臺(tái)之微信網(wǎng)頁登陸授權(quán)的方法,結(jié)合實(shí)例形式分析了微信網(wǎng)頁登陸授權(quán)的接口調(diào)用及參數(shù)含義,需要的朋友可以參考下2016-09-09PHP+Mysql+jQuery文件下載次數(shù)統(tǒng)計(jì)實(shí)例講解
這篇文章主要內(nèi)容是關(guān)于PHP+Mysql+jQuery文件下載次數(shù)統(tǒng)計(jì)實(shí)例講解2015-10-10PHP 超高性能可擴(kuò)展HTTP服務(wù)框架Webman
本文主要介紹了超高性能可擴(kuò)展HTTP服務(wù)框架Webman,webman用于替代傳統(tǒng)的php-fpm架構(gòu),提供超高性能可擴(kuò)展的HTTP服務(wù),感興趣的可以了解一下2024-02-02