先上图效果:
数据结构原来是这样:
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] => 欢乐谷店 ) )
根据需求,要根据name的第一个汉字首字母排序,那么就先需要写一个取首字母的方法:
/** * 取汉字的第一个字的首字母 * @param type $str * @return string|null * @user qichao * @date 2017-04-13 */ public function _getFirstCharter($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 || $asc==-9743) return 'B'; if($asc>=-19775&&$asc<=-19219) return 'C'; if($asc>=-19218&&$asc<=-18711 || $asc==-9767) 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 || $asc==-7182 || $asc==-6928 ) 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 || $asc==-6745) return 'P'; if($asc>=-14630&&$asc<=-14150 || $asc==-7703) 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; } //调用方法: $this->_getFirstCharter('张家口'); //然后下一步,要对这个二维数据排序。我思考了很久,后来想到了方案,先在循环里调用这个取首字母的方法,然后以这个字母作为key,因为php里有根据key排序的方法,所以我的代码写成这样就搞定了: public function getRegionlist() { $regionData = $this->_regionNamesArray(); $settlesRes = array(); foreach ($regionData as $key=>$sett){ $name = $sett['name']; $nameFirstChar = $this->_getFirstCharter($name); //取出第一个汉字的首字母 $settlesRes[$nameFirstChar][] = $sett;//以这个首字母作为key } ksort($settlesRes); return $settlesRes; } /** * 城市名称 */ public function _regionNamesArray() { //获取rid和城市name $result = UtilityGetSystemLocationRegionList::select('rid','name')->where('valid','=','T')->get()->toArray(); return $result; }
最后返回数据格式:
内容原创 转载请留言