Étude de cas sur l'obtention des premières lettres des caractères chinois en PHP et la mise en œuvre du tri par regroupement

黄舟
Libérer: 2023-03-16 18:10:01
original
1931 Les gens l'ont consulté

Avant-propos

Cet article vous présente principalement le contenu pertinent sur PHP en obtenant les premières lettres des caractères chinois et en les triant en groupes, car souvent lorsque nous faisons des projets , il y aura Les exigences pour le tri alphabétique incluent : Recherche par lettres dans la sélection de ville de Meituan http://www.meituan.com/index/changecity/initiative app

Titre principal

J'en ai trouvé plusieurs en ligne, mais ils n'étaient pas satisfaisants, alors j'en ai écrit un moi-même et je l'ai partagé avec tout le monde.


<?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;
 }

}
Copier après la connexion

Vous pouvez l'introduire directement dans le projet. Si vous avez besoin d'un espace de noms, vous pouvez l'ajouter vous-même. Voyons comment l'utiliser ci-dessous.


// 按首字母排序
$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;);
Copier après la connexion

Le résultat ci-dessous est-il celui que vous souhaitez ? Vous pouvez l'utiliser que vous créiez une application ou une page Web


$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;
  )
 )
);
Copier après la connexion

Résumé

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal