Heim  >  Artikel  >  Backend-Entwicklung  >  Fallstudie zum Erhalten der Anfangsbuchstaben chinesischer Schriftzeichen in PHP und zur Implementierung der Gruppierungssortierung

Fallstudie zum Erhalten der Anfangsbuchstaben chinesischer Schriftzeichen in PHP und zur Implementierung der Gruppierungssortierung

黄舟
黄舟Original
2017-10-23 09:03:551866Durchsuche

Vorwort

Dieser Artikel stellt Ihnen hauptsächlich den relevanten Inhalt darüber vor, wie PHP die Anfangsbuchstaben chinesischer Schriftzeichen abruft und sie in Gruppen sortiert, was häufig bei der Durchführung von Projekten der Fall ist , es wird folgende Anforderungen für die alphabetische Sortierung geben: Suche nach Buchstaben in Meituans Stadtauswahl http://www.meituan.com/index/changecity/initiative App

Haupttitel

Ich habe online verschiedene gefunden, aber sie waren nicht zufriedenstellend, also habe ich selbst einen geschrieben und ihn mit allen geteilt.


<?php

/**
 * @author Tech
 */
class Character
{
 /**
  * 二维数组根据首字母分组排序
  * @param array $data  二维数组
  * @param string $targetKey 首字母的键名
  * @return array    根据首字母关联的二维数组
  */
 public function groupByInitials(array $data, $targetKey = &#39;name&#39;)
 {
  $data = array_map(function ($item) use ($targetKey) {
   return array_merge($item, [
    &#39;initials&#39; => $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[&#39;initials&#39;]][] = $value;
  }
  ksort($sortData);
  return $sortData;
 }
 
 /**
  * 获取首字母
  * @param string $str 汉字字符串
  * @return string 首字母
  */
 public function getInitials($str)
 {
  if (empty($str)) {return &#39;&#39;;}
  $fchar = ord($str{0});
  if ($fchar >= ord(&#39;A&#39;) && $fchar <= ord(&#39;z&#39;)) {
   return strtoupper($str{0});
  }

  $s1 = iconv(&#39;UTF-8&#39;, &#39;gb2312&#39;, $str);
  $s2 = iconv(&#39;gb2312&#39;, &#39;UTF-8&#39;, $s1);
  $s = $s2 == $str ? $s1 : $str;
  $asc = ord($s{0}) * 256 + ord($s{1}) - 65536;
  if ($asc >= -20319 && $asc <= -20284) {
   return &#39;A&#39;;
  }

  if ($asc >= -20283 && $asc <= -19776) {
   return &#39;B&#39;;
  }

  if ($asc >= -19775 && $asc <= -19219) {
   return &#39;C&#39;;
  }

  if ($asc >= -19218 && $asc <= -18711) {
   return &#39;D&#39;;
  }

  if ($asc >= -18710 && $asc <= -18527) {
   return &#39;E&#39;;
  }

  if ($asc >= -18526 && $asc <= -18240) {
   return &#39;F&#39;;
  }

  if ($asc >= -18239 && $asc <= -17923) {
   return &#39;G&#39;;
  }

  if ($asc >= -17922 && $asc <= -17418) {
   return &#39;H&#39;;
  }

  if ($asc >= -17417 && $asc <= -16475) {
   return &#39;J&#39;;
  }

  if ($asc >= -16474 && $asc <= -16213) {
   return &#39;K&#39;;
  }

  if ($asc >= -16212 && $asc <= -15641) {
   return &#39;L&#39;;
  }

  if ($asc >= -15640 && $asc <= -15166) {
   return &#39;M&#39;;
  }

  if ($asc >= -15165 && $asc <= -14923) {
   return &#39;N&#39;;
  }

  if ($asc >= -14922 && $asc <= -14915) {
   return &#39;O&#39;;
  }

  if ($asc >= -14914 && $asc <= -14631) {
   return &#39;P&#39;;
  }

  if ($asc >= -14630 && $asc <= -14150) {
   return &#39;Q&#39;;
  }

  if ($asc >= -14149 && $asc <= -14091) {
   return &#39;R&#39;;
  }

  if ($asc >= -14090 && $asc <= -13319) {
   return &#39;S&#39;;
  }

  if ($asc >= -13318 && $asc <= -12839) {
   return &#39;T&#39;;
  }

  if ($asc >= -12838 && $asc <= -12557) {
   return &#39;W&#39;;
  }

  if ($asc >= -12556 && $asc <= -11848) {
   return &#39;X&#39;;
  }

  if ($asc >= -11847 && $asc <= -11056) {
   return &#39;Y&#39;;
  }

  if ($asc >= -11055 && $asc <= -10247) {
   return &#39;Z&#39;;
  }

  return null;
 }

}

Sie können es direkt in das Projekt einführen. Wenn Sie einen Namensraum benötigen, können Sie ihn unten selbst hinzufügen.


// 按首字母排序
$data = [
 [&#39;id&#39; => 1, &#39;area_name&#39; => &#39;山东&#39;],
 [&#39;id&#39; => 2, &#39;area_name&#39; => &#39;江苏&#39;],
 [&#39;id&#39; => 3, &#39;area_name&#39; => &#39;安徽&#39;],
 [&#39;id&#39; => 4, &#39;area_name&#39; => &#39;福建&#39;],
 [&#39;id&#39; => 5, &#39;area_name&#39; => &#39;江西&#39;],
 [&#39;id&#39; => 6, &#39;area_name&#39; => &#39;广东&#39;],
 [&#39;id&#39; => 7, &#39;area_name&#39; => &#39;广西&#39;],
 [&#39;id&#39; => 8, &#39;area_name&#39; => &#39;海南&#39;],
 [&#39;id&#39; => 9, &#39;area_name&#39; => &#39;河南&#39;],
 [&#39;id&#39; => 10, &#39;area_name&#39; => &#39;湖南&#39;],
 [&#39;id&#39; => 11, &#39;area_name&#39; => &#39;湖北&#39;],
];
// 初始化,然后调用分组方法
$data = (new Character)->groupByInitials($data, &#39;area_name&#39;);

Ist das Ergebnis unten Ihren Wünschen entsprechend? Sie können es verwenden, egal ob Sie eine App oder eine Webseite erstellen


$data = array(
 &#39;A&#39; => array(
  0 => array(
   &#39;id&#39; => 3,
   &#39;area_name&#39; => &#39;安徽&#39;,
   &#39;initials&#39; => &#39;A&#39;
  )
 ) ,
 &#39;F&#39; => array(
  0 => array(
   &#39;id&#39; => 4,
   &#39;area_name&#39; => &#39;福建&#39;,
   &#39;initials&#39; => &#39;F&#39;
  )
 ) ,
 &#39;G&#39; => array(
  0 => array(
   &#39;id&#39; => 6,
   &#39;area_name&#39; => &#39;广东&#39;,
   &#39;initials&#39; => &#39;G&#39;
  ) ,
  1 => array(
   &#39;id&#39; => 7,
   &#39;area_name&#39; => &#39;广西&#39;,
   &#39;initials&#39; => &#39;G&#39;
  )
 ) ,
 &#39;H&#39; => array(
  0 => array(
   &#39;id&#39; => 8,
   &#39;area_name&#39; => &#39;海南&#39;,
   &#39;initials&#39; => &#39;H&#39;
  ) ,
  1 => array(
   &#39;id&#39; => 9,
   &#39;area_name&#39; => &#39;河南&#39;,
   &#39;initials&#39; => &#39;H&#39;
  ) ,
  2 => array(
   &#39;id&#39; => 10,
   &#39;area_name&#39; => &#39;湖南&#39;,
   &#39;initials&#39; => &#39;H&#39;
  ) ,
  3 => array(
   &#39;id&#39; => 11,
   &#39;area_name&#39; => &#39;湖北&#39;,
   &#39;initials&#39; => &#39;H&#39;
  )
 ) ,
 &#39;J&#39; => array(
  0 => array(
   &#39;id&#39; => 2,
   &#39;area_name&#39; => &#39;江苏&#39;,
   &#39;initials&#39; => &#39;J&#39;
  ) ,
  1 => array(
   &#39;id&#39; => 5,
   &#39;area_name&#39; => &#39;江西&#39;,
   &#39;initials&#39; => &#39;J&#39;
  )
 ) ,
 &#39;S&#39; => array(
  0 => array(
   &#39;id&#39; => 1,
   &#39;area_name&#39; => &#39;山东&#39;,
   &#39;initials&#39; => &#39;S&#39;
  )
 )
);

Zusammenfassung

Das obige ist der detaillierte Inhalt vonFallstudie zum Erhalten der Anfangsbuchstaben chinesischer Schriftzeichen in PHP und zur Implementierung der Gruppierungssortierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn