ã¯ããã« ããã«ã¡ã¯ãéçºãšã³ãžãã¢ã® amdaba_skïŒ ãã³ã ãŒã æªå®ïŒã§ãã ä»å㯠PHP ã®ã話ã§ããäŸãã°ä»¥äžã®ãããªé
åããã£ããšããŸãããã <?php $ target = [ 'ã»ã' , 'ãµã' , 'ãŽã' , ] ; ããããœãŒãããããšããŸãããã ããã ããªãã <?php sort ( $ target ) ã§ãããŸãã Q.E.D. ïŒ ã§ãããã®ã§ããã PHP ã«ã¯ä»ã«ããããããªé
åã®ãœãŒãæ¹æ³ãçšæãããŠããŸãããã ãã®èšäºã¯ãããããããããªãœãŒãæ¹æ³ã玹ä»ããç¹ã«æ¥æ¬èªæååãå€ã«æã€é
åã®å Žåãã£ãšãã€ã€æããã«ããæ¹æ³ããããŸãããšããã話ã§ãã ãªãããœãŒãã«éãã PHP ã®é
åæ©èœã«ã€ããŠç¥ããããšããæ¹ã¯ãåŒç€Ÿããã°ã®ãã¡ãã®èšäºã䜵ããŠãã§ãã¯ããŠã¿ãŠãã ãããã tech-blog.rakus.co.jp ããã ã¯ããã« ããã PHP ã®é
åãœãŒã颿°ãããã æšæºã®é
åãœãŒã颿° - sort SORT_REGULAR SORT_STRING æ¥æ¬èªæååãã€ã€æãã«äžŠã¹ã sort 颿°ã« SORT_LOCALE_STRING ãã©ã°ãæå®ãã intl æ¡åŒµã䜿ã - Collator::sort ãŸã㯠collator_sort ç¬èªã«ãŒã«ãå®è£
ãã - usort å®è£
äŸïŒããã¯é ãããã« PHP ã®é
åãœãŒã颿°ãããã ãæ±ºãŸãã§ããããããããšããŸãã¯å
¬åŒã®ã PHP ããã¥ã¢ã«ããèŠã«è¡ãããã«ããŸãããã PHP ã¯å
¬åŒããã¥ã¢ã«ããšãŠãå
å®ããŠããŸããããé
åã®ãœãŒãã«ã€ããŠããããã«ã€ããŠãŸãšããå°çšã®ããŒãžããããŸãã www.php.net 颿°å ãœãŒãã®åºæº ããŒãšå€ã®çžé¢é¢ä¿ ãœãŒãé é¢é£ãã颿° array_multisort() å€ é£æ³é
å ã®å Žåã¯ç¶æããæ°å€æ·»åé
åã®å Žåã¯ç¶æããªã æåã®é
åããããã¯ãœãŒããªãã·ã§ã³ array_walk() asort() å€ ç¶æãã æé arsort() arsort() å€ ç¶æãã éé asort() krsort() ããŒ ç¶æãã éé ksort() ksort() ããŒ ç¶æãã æé asort() natcasesort() å€ ç¶æãã 倧æåå°æåãåºå¥ããªãèªç¶é natsort() natsort() å€ ç¶æãã èªç¶é natcasesort() rsort() å€ ç¶æããªã éé sort() shuffle() å€ ç¶æããªã ã©ã³ãã array_rand() sort() å€ ç¶æããªã æé rsort() uasort() å€ ç¶æãã ãŠãŒã¶ãŒå®çŸ© uksort() uksort() ããŒ ç¶æãã ãŠãŒã¶ãŒå®çŸ© uasort() usort() å€ ç¶æããªã ãŠãŒã¶ãŒå®çŸ© uasort() é
åããœãŒããã颿°ã衚ã§ãŸãšããããããããã®é¢æ°ã®ãœãŒãã®åºæºïŒã㌠or å€ïŒãããŒãšå€ã®çžé¢ããœãŒãé ãé¢é£ãã颿°ãäžèЧã§ããŸããå颿°ããšã®è©³çްããŒãžãžã®ãªã³ã¯ããã£ãŠãå匷ã«ã圹ç«ã¡ãŸãã äœè«ã§ããããœãŒãã®åºæºãšããŒãšå€ã®çžé¢ãæ
å ±ãšããŠå
¥ã£ãŠããã®ã¯ããã¹ãŠã®é
åã 飿³é
å 㪠PHP ã®ç¹åŸŽçãªãšããã§ããã ããŠãããã¥ã¢ã«ã¯ PHP ã®äžè¬ã®é
åã«é¢ãããã®ã§ãããæ¬èšäºã§ã¯æååãå€ãšããŠæã€ãäžæ¬¡å
ã®é£çªæŽæ°å€æ·»åã®é
åã«ã€ããŠèããŸããäŸãã°ããã€ãã®éçåä»ãèšèªã ãšã察象é
åãæ¬¡ã®ããã«åä»ããããå Žåã§ã 1 ã Java : List<String> , C# : List<string> , TypeScript: string[] , Scala : List[String] , F#: string list , Haskell : [Text] ãŸãããã§ã«æé»çã«åæãšããŠããŸãããç¹ã«æ¥æ¬èªã®æåãå«ãæååãæ³å®ããŠããŸãã ãã®ãããªåé¡èšå®ã®äžã§ãããã§ã¯ sort 颿°ã«ã€ããŠè©³ããèŠãŠããããšã«ããŸãããã æšæºã®é
åãœãŒã颿° - sort www.php.net sort ( array &$array , int $flags = SORT_REGULAR ) : bool sort ã¯é
åãæé ã«ãœãŒããã颿°ã§ãã 第äžåŒæ° $array ã«ãœãŒããããé
åãžã®åç
§ãåãåã£ãŠããœãŒãã«æåãããã©ãããçåœå€ã§è¿ããŸããåŒæ°ã§æž¡ããé
åã¯ããã®é¢æ°ã®å®è¡ã«ãã£ãŠå€æŽãããŸããç Žå£çãªäœçšãæã€é¢æ°ãšããããšã§ãã ãŸããªãã·ã§ã³ã®ç¬¬äºåŒæ° $flags ã«æŽæ°ã§è¡šããããã©ã°ãåããèŠçŽ ã®å€§å°é¢ä¿ã®å€å®æ¹æ³ãåãæ¿ããããšãåºæ¥ãŸãã䜿ããå€ã¯ä»¥äžã®éãã§ãã SORT_REGULAR - éåžžéãã«é
ç®ãæ¯èŒããŸãã 詳现㯠æ¯èŒ æŒç®å ã§èª¬æãããŠããŸãã SORT_NUMERIC - æ°å€ãšããŠé
ç®ãæ¯èŒããŸãã SORT_STRING - æååãšããŠé
ç®ãæ¯èŒããŸãã SORT_LOCALE_STRING - çŸåšã® ãã±ãŒã« ã«åºã¥ããŠãæååãšããŠé
ç®ãæ¯èŒããŸãã æ¯èŒã«äœ¿ã ãã±ãŒã« ã¯ãsetlocale() 颿°ã§å€æŽã§ããŸãã SORT_NATURAL - èŠçŽ ã®æ¯èŒãæååãšããŠè¡ãã natsort() ãšåæ§ã®ãèªç¶é ãã§æ¯èŒããŸãã SORT_FLAG_CASE - SORT_STRING ã SORT_NATURAL ãš (ãããORã§) çµã¿åãããŠäœ¿ãã æååã®ãœãŒãã§å€§æåå°æåãåºå¥ããªãããã«ããŸãã ãããã¯ãã¹ãŠã PHP ã®ã°ããŒãã«ãªå®æ°ãšããŠå®çŸ©ãããŠããŸããããã€ãããã¯ã¢ããããŠã¿ãŸãããã SORT_REGULAR SORT_REGULAR 㯠sort ã®ç¬¬äºåŒæ° $flags ã®ããã©ã«ãå€ã§ãããã®å€ãæå®ãããå ŽåãèŠçŽ ã®å€§å°é¢ä¿ã®å€å®ã«ã¯å®å®è¹ æŒç®å <=> ïŒãšåçã®åŠçïŒã䜿ãããŸãã å®å®è¹ æŒç®å ã®è©³çްã«ã€ããŠã¯ å
¬åŒããã¥ã¢ã«ã®è©²åœããããŒãž ãåç
§ããŠã»ããã®ã§ããã SORT_REGULAR ãæå®ãããå Žåã® sort ã¯ããã¹ãŠã®èŠçŽ ãæååã§ããåæã§ããã°ã次ã«åãäžãã SORT_STRING ãšå€ãããŸããã ãã ãããã¥ã¢ã«äžã§ã以äžã®ãããªèŠåãããããã«ãèŠçŽ ã«è€æ°ã®åãæ··åšããå Žåã¯æ³šæãå¿
èŠã§ãã èŠå flags ã SORT_REGULAR ã®å Žåã« è€æ°ã®åãæ··åšããé
åããœãŒãããå Žåã«ã¯ã泚æããŠãã ããã sort() ãæåŸ
ããªãçµæãåºåããããšããããŸãã ãã®ä»¶ã«é¢ãã詳现ã¯ãããªãå€ãèšäºã§ã¯ãããŸããã以äžãåèã«ãªããŸãã hnw.hatenablog.com SORT_STRING SORT_STRING ãæå®ãããå Žå sort 颿°ã¯åèŠçŽ ãæååã§ãããšããŠå€§å°é¢ä¿ãæ¯èŒããŸãã æååã§ãããšããŠæ¯èŒãããšã¯ã€ãŸããæååãæåã®é
åã§ãããšããŠã æåã³ãŒã ã®æ°å€ç倧å°é¢ä¿ã«åºã¥ãèŸæžåŒé åºã§æ¯èŒãã 2 ãšããããšã§ãã äŸãã° 'abc' ãš 'abd' ãæ¯èŒããå Žåã以äžã®ããã«å
é ããäžæåãã€æåã®å€§å°ãæ¯èŒããŠãããŸãã æåäœçœ® 'abc' 'abd' æ¯èŒ 1 a a a = a 2 b b b = b 3 c d c < d å
šäœ 'abc' 'abd' 'abc' < 'abd' åããŠéãã®åºãæåäœçœ®ã®æåã®å€§å°ã§ãæååå
šäœã®å€§å°ã決ãŸããŸããã¡ãªã¿ã«æååã®çµç«¯ã¯ãã©ããªæåãããå°ãããšå€å®ãããŸãã PHP ã«ãããŠã¯ãæçµçã« C èšèªã® memcmp 颿°ãçšããå®è£
ããããŠããŸã 3 ã æ¥æ¬èªæååãã€ã€æãã«äžŠã¹ã ããã§ä»¥äžã®ãããªé
åããœãŒãããããšãèããŠã¿ãŸãããã é äœ æåå èªã¿ UTF-8 æåã³ãŒã å€ 1 ãã¶ãã ã ã¢ããªãã· E38182 E381B6 E3828A E381A0 E38197 2 ããŸã¬ã ã¢ãã¬ã E38182 E381BE E382AC E3839F 3 ãããŒã ãŠã€ãŒã³ E38186 E38184 E383BC E38293 4 ã¢ãããã£ã ã¢ãããã£ã E382A2 E38395 E383AD E38387 E382A3 E38386 5 ã¢ãããã£ãŒã ã¢ãããã£ãŒã E382A2 E38395 E383AD E38387 E382A3 E383BC E38386 6 ã¢ãããã£ã ã¢ãããã£ã E382A2 E38397 E383AD E38387 E382A3 E38386 7 ã¢ãã¬ã ã¢ãã¬ã E382A2 E3839E E382AC E3839F 8 ãŠã£ãŒã³ ãŠã£ãŒã³ E382A6 E382A3 E383BC E383B3 9 äžéäžäºº ã€ããã³ã·ã§ãŠãã³ E4B880 E9818D E4B88A E4BABA 10 æªäººæ£æ© ã¢ã¯ãã³ã·ã§ãŠã E682AA E4BABA E6ADA3 E6A99F 11 é¿é梚 ã¢ãžã£ãª E998BF E9978D E6A2A8 äžè¡šã¯ sort 颿°ã« SORT_STRING ãæå®ããŠäžŠã¹æ¿ããé ã«èšèŒããŠããŸããåæååã® UTF-8 æåã³ãŒã å€ã 16 鲿°è¡šç€ºã§ä»ããŸããããããèŠãŠããããšãåç¯ã§èª¬æããéãã®é åºã«äžŠãã§ããããšãåãããŸãã äžæ¹ã§ãã±ã£ãšèŠãŠãã®é åºã¯ãã€ã€æããã§ããããïŒ å°ãèããã°çŽåŸã§ãããã§ãããããããã±ã£ãšèŠã ãšããªãã§ãããªé åºã«ãªã£ãŠããã®ïŒããšæã£ãŠããŸãã®ã§ã¯ãªãã§ããããã äžçã«ã¯ãããããªèšèªãããã䜿çšããŠããæåãéããŸããããããã®èšèªã§ã®æé©ãªæåã®äžŠã³é ãã æåã³ãŒã ã®å€§å°ãšã¯äžèŽããªãããšããããŸããæ¥æ¬èªã ãšãæååã¯åºæ¬ãèªã¿ãã®é ã«äžŠã¹ãã®ãæ®éã§ãããã ããŠãããããæ¬é¡ã«ãã©ãçããŸãããæ¥æ¬èªæååã PHP ã§ãã€ã€æããã«ãœãŒãããã«ã¯ã©ã®ããã«ããã°ããã§ããããïŒ å
ã«çµè«ããããšã以äžã® 3 ã€ã®æ¹æ³ããããŸãã sort 颿°ã« SORT_LOCALE_STRING ãã©ã°ãæå®ãã intl æ¡åŒµã䜿ã - Collator::sort ãŸã㯠collator_sort ç¬èªã«ãŒã«ãå®è£
ãã - usort äžã€ãã€èŠãŠãããŸãããã sort 颿°ã« SORT_LOCALE_STRING ãã©ã°ãæå®ãã æšæºã®ãœãŒã颿°ã§ãã sort ã¯ãå
ã«ã説æããéããªãã·ã§ã³ã®ç¬¬äºåŒæ° $flags ã«ãã£ãŠèŠçŽ ã®å€§å°é¢ä¿ã®å€å®æ¹æ³ãåãæ¿ããããšãåºæ¥ãŸãã $flags ã« SORT_LOCALE_STRING ãæå®ãããå Žåã SORT_STRING ãšåæ§åèŠçŽ ãæååã§ãããšããŠå€§å°é¢ä¿ãæ¯èŒããŸããããã®éãçŸåšã® ãã±ãŒã« ã«åºã¥ããŠå°ååãããæ¯èŒã«ãŒã«ãçšããŸãã æååãæåã®é
åã§ãããšããŠå
é ããäžæåãã€æåã®å€§å°ãæ¯èŒãããšããç¹ã¯ SORT_STRING ã®æãšåæ§ãªã®ã§ãããæåå士ã®å€§å°æ¯èŒã«ãŒã«ãåçŽãª æåã³ãŒã ã®å€§å°æ¯èŒã§ã¯ãããŸããã SORT_LOCALE_STRING ã䜿ã£ãå Žåã PHP ã¯å
éšçã«ã¯ C èšèªã® strcoll 颿°ã䜿ã£ãŠæååã®æ¯èŒããŸã 4 ãããã«ãã£ãŠ ãã±ãŒã« ã瀺ãå°åã®èšèªã«é©ããæ¹æ³ã§æåã®å€§å°æ¯èŒãããŠããããšããããã§ãã å
ã»ã©ã®ãµã³ãã«é
åã ãã±ãŒã« ã ja_JP.UTF-8 ã®ç°å¢äžã§ã SORT_STRING ãš SORT_LOCALE_STRING ã®ããããã§ãœãŒãããçµæãæ¯èŒãããšãäžã®ããã«ãªããŸãã --- SORT_STRING +++ SORT_LOCALE_STRING @@ @@ Array ( 0 => 'ãã¶ãã ã' 1 => 'ããŸã¬ã' 2 => 'ãããŒã' - 3 => 'ã¢ãããã£ã' - 4 => 'ã¢ãããã£ãŒã' + 3 => 'ã¢ãããã£ãŒã' + 4 => 'ã¢ãããã£ã' 5 => 'ã¢ãããã£ã' 6 => 'ã¢ãã¬ã' 7 => 'ãŠã£ãŒã³' - 8 => 'äžéäžäºº' + 8 => 'é¿é梚' 9 => 'æªäººæ£æ©' - 10 => 'é¿é梚' + 10 => 'äžéäžäºº' ) æ¯èŒçµæãèŠããšããã²ãã㪠â ã«ã¿ã«ã â æŒ¢åããšããæåçš®ããšã®äžŠã³é 㯠SORT_STRING ã®æãšåæ§ã§ãããããæŒ¢åæååã ããèŠããšãã㢠â ã¢ã¯ â ã€ãããšèªã¿ã®é ã«äžŠãã§ããŠãããæ¥æ¬èªã®æååãšããŠèªç¶ãšæãã䞊ã³é ã«ãªã£ãŠãããšèšããŸãã ãã詳现ã«ã©ã®ãããªæ¯èŒã«ãŒã«ã«ãªã£ãŠããã®ããšãããšãç³ãèš³ãªãã®ã§ããã«ããä»èŸŒã¿ã® C èšèªã¢ãããè¶³ãããåãããŸããã§ããããããã PHP ã ã³ã³ãã€ã« ããéã®åŠçç³»ã«äŸåãããã®ãšèããŠããã®ã§ãããå®éã®ãšããã©ããªã®ã§ããããæããŠã€ãã€ããªäººâŠâŠïŒ intl æ¡åŒµã䜿ã - Collator::sort ãŸã㯠collator_sort www.php.net ãªããžã§ã¯ãæå å public Collator::sort ( array &$arr , int $sort_flag = ? ) : bool æç¶ãå collator_sort ( Collator $coll , array &$arr , int $sort_flag = ? ) : bool PHP ããã«ãããéã«ãåœéåçšæ¡åŒµã¢ãžã¥ãŒã« (intl æ¡åŒµ) ãæå¹ã«ããããšã§ã ICU ã©ã€ãã©ãªã®ã©ãããŒã䜿ãããšãåºæ¥ãããã«ãªããŸããã©ã€ãã©ãªã§æäŸãããæ©èœã¯ããã€ããããŸãããããã§æ³šç®ããã®ã¯ Collator ã§ãã Collator ã¯ã ãã±ãŒã« ã«å¿ããé©åãªäžŠã³é ãèæ
®ããæååæ¯èŒæ©èœãæäŸããã¯ã©ã¹ã§ãã䞊ã³é ã®ã«ãŒã«ã¯ UCA ã«æºæ ããŠããŸãã Collator ã䜿ã£ãŠé
åãäžŠã¹æ¿ããã«ã¯ã ã€ã³ã¹ã¿ã³ã¹ ã¡ãœããã® Collator::sort ããããã㯠collator_sort 颿°ã䜿ããŸãã äœ¿ãæ¹ã¯æšæºã® sort 颿°ãšã»ãŒåãã§ãåŒæ° $arr ã«ãœãŒããããé
åãžã®åç
§ãåãåã£ãŠããœãŒãã«æåãããã©ãããçåœå€ã§è¿ããŸããåŒæ°ã§æž¡ããé
åã¯ããã®é¢æ°ã®å®è¡ã«ãã£ãŠå€æŽãããŸããç Žå£çãªäœçšãæã€é¢æ°ãšãããšãããåãã§ãã ãŸããªãã·ã§ã³ã®åŒæ° $sort_flag ã«æŽæ°ã§è¡šããããã©ã°ãåããèŠçŽ ã®å€§å°é¢ä¿ã®å€å®æ¹æ³ãåãæ¿ããããšãåºæ¥ãŸãã䜿ããå€ã¯ä»¥äžã®éãã§ãã Collator::SORT_REGULAR - éåžžã®æ¯èŒ (åã倿Žããªã) Collator::SORT_NUMERIC - æ°å€ãšããŠã®æ¯èŒ Collator::SORT_STRING ã- æååãšããŠã®æ¯èŒ çç¥ããå Žåã®ããã©ã«ã㯠Collator::SORT_REGULAR ã§ãããèŠçŽ ããã¹ãŠæååã§ããå Žå㯠Collator::SORT_STRING ãæå®ããå Žåãšçµå±ã®ãšããåãã«ãªããŸã 5 ããã㊠Collator::SORT_STRING ãæå®ãããå Žåã Collator::sort ã¯å
éšçã« ICU ã©ã€ãã©ãªã§æäŸããã C èšèªã®é¢æ° ucol_strcoll 6 ã䜿çšããŠæååã®æ¯èŒãããŸã 7 ã ãã±ãŒã« ja_JP.UTF-8 ãæå¹ãªç°å¢äžã§ããµã³ãã«é
åãæšæºã® sort + SORT_LOCALE_STRING ãš Collator::sort + Collator::SORT_STRING ã®ããããã§ãœãŒãããŠæ¯èŒããŠã¿ãŸãããã <?php namespace Tests\Unit; use PHPUnit\Framework\TestCase; use Collator; class CollatorSortTest extends TestCase { /** * ãã±ãŒã«ã®èšå®ïŒSORT_LOCALE_STRING çšïŒ */ public static function setUpBeforeClass () : void { parent :: setUpBeforeClass () ; setlocale ( LC_COLLATE, 'ja_JP.UTF-8' ) ; } /** * sort + SORT_LOCALE_STRING ãš Collator::sort + Collator::SORT_STRING ã® * ãœãŒãçµæãæ¯èŒãããã¹ãã±ãŒã¹ * @return void */ public function testCollatorSort () { $ sample = [ 'ãã¶ãã ã' , 'ããŸã¬ã' , 'ãããŒã' , 'ã¢ãããã£ã' , 'ã¢ãããã£ãŒã' , 'ã¢ãããã£ã' , 'ã¢ãã¬ã' , 'ãŠã£ãŒã³' , 'äžéäžäºº' , 'æªäººæ£æ©' , 'é¿é梚' , ] ; $ sortLocalString = $ this -> sortAndReturn ( fn ( &$ arr ) => sort ( $ arr , SORT_LOCALE_STRING ) , $ sample ) ; $ sortCollator = $ this -> sortAndReturn ( fn ( &$ arr ) => Collator :: create ( 'ja_JP.utf8' ) -> sort ( $ arr ) , $ sample ) ; $ this -> assertEquals ( $ sortLocalString , $ sortCollator ) ; } /** * é
åã«ãœãŒã颿°ãé©çšããŠè¿ã * @param callable $sortFunc ãœãŒã颿° * @param array $arr 察象é
å * @return array */ private function sortAndReturn ( callable $ sortFunc , array $ arr ) : array { $ sortFunc ( $ arr ) ; return $ arr ; } } å®è¡ãããšãã®ãã¹ãã±ãŒã¹ã¯å€±æããŠã以äžã®å·®ååºåãåºãŠæ¥ãŸãã --- Expected (sort + SORT_LOCALE_STRING) +++ Actual (Collator::sort + Collator::SORT_STRING) @@ @@ Array ( 0 => 'ãã¶ãã ã' - 1 => 'ããŸã¬ã' - 2 => 'ãããŒã' - 3 => 'ã¢ãããã£ãŒã' - 4 => 'ã¢ãããã£ã' - 5 => 'ã¢ãããã£ã' - 6 => 'ã¢ãã¬ã' - 7 => 'ãŠã£ãŒã³' + 1 => 'ã¢ãããã£ãŒã' + 2 => 'ã¢ãããã£ã' + 3 => 'ã¢ãããã£ã' + 4 => 'ã¢ãã¬ã' + 5 => 'ããŸã¬ã' + 6 => 'ãŠã£ãŒã³' + 7 => 'ãããŒã' 8 => 'é¿é梚' 9 => 'æªäººæ£æ©' 10 => 'äžéäžäºº' ) æ¯èŒçµæãèŠããšããããªæå â æŒ¢åããšãã䞊ã³é ã¯çžå€ãããã§ããã Collator::sort ã§ã¯ sort + SORT_LOCALE_STRING ãšã¯éã£ãŠãã²ãããªãšã«ã¿ã«ãã®åºå¥ããªããªããé³ã®é ã§äžŠã¹ãããããã«ãªããŸããããŸã挢åæååå士ã§ããã°ãã¯ãèªã¿ã®é ã«äžŠãã§ããŠã sort + SORT_LOCALE_STRING ãããããã«æ¥æ¬èªã®æååãšããŠèªç¶ãšæãã䞊ã³é ã«ãªã£ãŠãããšèšããŸãã ç¬èªã«ãŒã«ãå®è£
ãã - usort www.php.net usort (array &$array , callable $callback ): bool sort + SORT_LOCAL_STRING ã Collator::sort ã§ãæºè¶³ã§ããªããã ããæŽŸã®æ¹ã«ã¯ãç¬èªã«æ¯èŒé¢æ°ãå®è£
ããæ¹æ³ãã玹ä»ããŸãããã usort ã¯ç¬¬äžåŒæ° $array ã«ãœãŒããããé
åãžã®åç
§ãåãåã£ãŠããœãŒãã«æåãããã©ãããçåœå€ã§è¿ããŸããåŒæ°ã§æž¡ããé
åã¯ããã®é¢æ°ã®å®è¡ã«ãã£ãŠå€æŽãããŸããç Žå£çãªäœçšãæã€é¢æ°ãšããããšã§ãã sort ãšç°ãªãã®ã¯ç¬¬äºåŒæ°ããã©ã°ã§ã¯ãªããèŠçŽ ãæ¯èŒããããã®é¢æ°ã§ããããã€å¿
é ã§ãããšããç¹ã§ããç¡çãã ã·ã°ãã㣠ãäžãšåãããã«æžããªãã°ã第äºåŒæ°ã®ã³ãŒã«ããã¯é¢æ°ã¯ä»¥äžã®ããã«ãªãã§ããããã $callback (mixed $element1 , mixed $element2 ): int é
åã®èŠçŽ ãåŒæ°ãšããŠäºã€åããæŽæ°å€ãè¿ã颿°ã§ããè¿ãå€ã® int ã¯ãæåã®åŒæ° $element1 ã®ã»ããäºçªç®ã®åŒæ° $element2 ãã倧ããå Žåã¯æ£ã®æ°ããçããå Žåã¯ãŒããããããŠå°ããå Žåã¯è² ã®æ°ãè¿ãããã«å®è£
ããŸãã ãã®ã³ãŒã«ããã¯é¢æ°ã«ãã£ãŠã奜ããªã«ãŒã«ã§ãœãŒããå®çŸããããšãåºæ¥ããšãã寞æ³ã§ããèŠä»¶ã«åãããŠé©åãªã«ãŒã«ãå®è£
ããŸããããã¡ãªã¿ã«æé éé ã®åæ¿ããè¿ãå€ã®æ£è² ãå転ãããããšã§å®çŸããããšãåºæ¥ãŸãïŒ ursort ãç¡ãã®ã¯ãã®ããã§ãããïŒã å®è£
äŸïŒããã¯é ãã£ãããªã®ã§ ursort ã䜿ã£ãç¬èªãœãŒã颿°ã®å®è£
ããã£ãŠã¿ãŸãããã ursort ã䜿ãã®ã§ããã°ãé
åã®åèŠçŽ æååãããœãŒãããŒïŒãã¿ããªçïŒãå¥éäœæããŠä»ãå ããããã䜿ã£ãŠãœãŒãããªããŠããšãã§ããã§ãããããããã§ã¯ä»¥äžã®ç°¡åãªæ¡ä»¶ã§å®è£
ããŠã¿ãŸãã ãœãŒã察象é
åã®èŠçŽ æååã¯ãã¹ãŠãã²ãããªãã§æ§æããã ãã ãæ¿é³ãåæ¿é³ãé·é³ãæé³ãä¿é³ã«çžåœããæåã¯å«ãŸããªããã®ãšãã åæååã¯èŸæžåŒé åºã§é åºæ¯èŒãã åæåã®é åºã¯ã ããã¯é ãã«åŸã ã§ããããã¯ãã¡ãã§ãã <?php class IrohaOrder { /** @var array $iroha ããã¯é ãã¹ã¿ */ private $ iroha = [ 'ã' , 'ã' , 'ã¯' , 'ã«' , 'ã»' , 'ãž' , 'ãš' , 'ã¡' , 'ã' , 'ã¬' , 'ã' , 'ã' , 'ã' , 'ã' , 'ã' , 'ã' , 'ã' , 'ã' , 'ã€' , 'ã' , 'ãª' , 'ã' , 'ã' , 'ã' , 'ã' , 'ã®' , 'ã' , 'ã' , 'ã' , 'ãŸ' , 'ã' , 'ãµ' , 'ã' , 'ã' , 'ãŠ' , 'ã' , 'ã' , 'ã' , 'ã' , 'ã' , 'ã¿' , 'ã' , 'ã' , 'ã²' , 'ã' , 'ã' , 'ã' , 'ã' , ] ; /** * æååé
åãããã¯é ã«äžŠã¹ã * @param array $arr * @return bool ãœãŒãã§ãããã©ãã */ public function sort ( array &$ arr ) : bool { try { usort ( $ arr , fn ( $ a , $ b ) => $ this -> compare ( $ a , $ b )) ; return true ; } catch ( RangeException $ e ) { return false ; } } /** * æååãäºã€åãåã£ãŠããã¯é ã«åŸã£ãŠé åºã決ãã * @param string $a * @param string $b * @return int <=> ã®ä»æ§ã«æ²¿ã£ãæŽæ°å€ * @throws RangeException åŒæ°ã®æååã«ããã¯é ãä»ããããªãå Žå */ public function compare ( string $ a , string $ b ) : int { $ lenA = mb_strlen ( $ a ) ; $ lenB = mb_strlen ( $ b ) ; $ ret = 0 ; for ( $ i = 0 ; $ i < min ([ $ lenA , $ lenB ]) ; $ i ++ ) { $ c = $ this -> getCharIndex ( mb_substr ( $ a , $ i , 1 )) ; $ d = $ this -> getCharIndex ( mb_substr ( $ b , $ i , 1 )) ; $ ret = $ c <=> $ d ; if ( $ ret !== 0 ) { break ; } } return $ ret ?: $ lenA <=> $ lenB ; } /** * ã²ãããªäžæåãåã£ãŠããã¯é ã§ã®é äœãè¿ã * @param string $c ã²ãããªäžæå * @return int ããã¯é ã§äœçªç®ã * @throws RangeException åŒæ°ã®æååã«ããã¯é ãä»ããããªãå Žå */ private function getCharIndex ( string $ c ) : int { $ ret = array_search ( $ c , $ this -> iroha, true ) ; if ( $ ret === false ) { throw new RangeException ( "Character ${$c} is not supported!" ) ; } return $ ret ; } } äœ¿ãæ¹ã®ãµã³ãã«ãå
ŒããŠããã¹ããç°¡åã«äœã£ãŠã¿ãŸããã <?php namespace Tests\Unit; use PHPUnit\Framework\TestCase; use IrohaOrder; class IrohaOrderTest extends TestCase { /** @var IrohaOrder $irohaOrder */ private $ irohaOrder ; public function setUp () : void { $ this -> irohaOrder = new IrohaOrder () ; } /** * ã²ãããªæååé
åãããã¯é ã«äžŠã¶ããšã®ç¢ºèª * @return void */ public function testIrohaOrderSort () { $ expected = [ 'ããã' , 'ãããã' , 'ããã' , 'ã¯ã«ã' , 'ã«ãã' , 'ã«ãããã' , 'ã»ãšã' , 'ã»ãã' , 'ãžãã' , 'ãžãã' , 'ãšãã' , ] ; $ sorted = $ this -> shuffleAndSort ( fn ( &$ arr ) => $ this -> irohaOrder -> sort ( $ arr ) , $ expected ) ; $ this -> assertEquals ( $ expected , $ sorted ) ; } /** * é
åãã·ã£ããã«ããŠãœãŒã颿°ãé©çšããŠè¿ã * @param callable $sortFunc ãœãŒã颿° * @param array $arr 察象é
å * @return array */ private function shuffleAndSort ( callable $ sortFunc , array $ arr ) : array { shuffle ( $ arr ) ; $ sortFunc ( $ arr ) ; return $ arr ; } } å®è¡ããŠã¿ãŸãããã PHPUnit 9.5.2 by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: 00:00.004, Memory: 4.00 MB OK (1 test, 1 assertion) ããŸãåããŠããããã§ãã ãããã« ãããã§ããã§ããããïŒ æ¬èšäºã§ã¯ãæ¥æ¬èªæååãå€ãšããŠæã€äžæ¬¡å
ã®é£çªæŽæ°å€æ·»åã®é
åã察象ãšããŠã PHP ã§å©çšå¯èœãªãœãŒãæ¹æ³ãããã€ãåãäžããŠå
·äœäŸãšãšãã«ç޹ä»ããŸããããã€ã³ãããŸãšãããšä»¥äžã®ããã«ãªããŸãã PHP ã§é
åããœãŒãããæ¹æ³ã¯ãããããã ã·ã³ãã«ãª sort 颿°ã®çµæã¯æã«ãã€ã€æããã«ãªããªã PHP ã§æ¥æ¬èªæååããã€ã€æããã®é åºã§äžŠã¹ãæ¹æ³ã¯ 3 éã ãã® 3 éãã®æ¹æ³ã¯ä»¥äžã®éãã§ãã sort 颿°ã§ SORT_LOCAL_STRING ãã©ã°ãæå®ãã æãäœã³ã¹ã å®éã®äžŠã³é 㯠åŠçç³»äŸå ïŒïŒïŒ intl æ¡åŒµã® Collator::sort ãŸã㯠collator_sort ãäœ¿ã æ¡åŒµã®æå¹åãå¿
èŠã§å°ãé¢å UCA ã«æºæ ããé åºã§ã®ãœãŒããå¯èœ ç¬èªã«ãŒã«ãå®è£
ãã æãé«ã³ã¹ã 䞊ã³é ã«ãŒã«ãèªç±ã«æ±ºãããã ããã§ã©ã®æ¹æ³ãäžçªãã€ã€æãããªã®ããšãããšãçµå±èŠä»¶æ¬¡ç¬¬ã«ã¯ãªã£ãŠããŸããã®ã®ãå人çã«ã¯ 2 çªã® intl æ¡åŒµã® Collator::sort ãŸã㯠collator_sort ãäœ¿ãæ¹æ³ã以äžã®ç¹ã§ãã€ã€æããã ãšæããŸãã Unicode ã®æè¡æšæºãšããŠå®ãããã仿§ã«æºæ ã§ãã å€éšã®ãããã¹ããããã©ã€ãã©ãªã䜿çšã§ãã 仿§ã®æšæºããšå®è£
ã³ã¹ãã®ãã©ã³ã¹ããã 以äžã PHP ã§æ¥æ¬èªã®æååé
åãã€ã€æãã«ãœãŒããã話ã§ãããå°ãã§ãã¿ãªããã® PHP ã©ã€ãã®åèã«ããŠããã ããã幞ãã§ãã â» æ¬èšäºã«èšèŒãããµã³ãã«ã³ãŒã㯠php 7.4.15 ( cli ) ã§åäœã確èªããŠããŸãã ãšã³ãžã㢠äžéæ¡çš ãµã€ã ã©ã¯ ã¹ã§ã¯ããšã³ãžãã¢ã»ãã¶ã€ããŒã® äžéæ¡çš ãç©æ¥µçã«è¡ã£ãŠãããŸãïŒ ãèå³ãããŸãããæ¯éã確èªããé¡ãããŸãã https://career-recruit.rakus.co.jp/career_engineer/ ã«ãžã¥ã¢ã«é¢è«ãç³èŸŒã¿ãã©ãŒã ã©ã®è·çš®ã«å¿åããã°è¯ããããããªããšããæ¹ã¯ãã«ãžã¥ã¢ã«é¢è«ãéæè¡ã£ãŠãããŸãã 以äžãã©ãŒã ãããç³èŸŒã¿ãã ããã rakus.hubspotpagebuilder.com ã©ã¯ ã¹Developersç»é²ãã©ãŒã https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ ã€ãã³ãæ
å ± äŒç€Ÿã®é°å²æ°ãç¥ãããæ¹ã¯ãæ¯é±éå¬ããŠããã€ãã³ãã«ãåå ãã ããïŒ âTECH PLAY techplay.jp âconnpass rakus.connpass.com èšèªã«ãã£ãŠã¯ä»ã«ãã£ãšããåããããããããŸãããããã®èŸºã¯ã¹ã«ãŒã§ãé¡ãããŸãã ↩ https://ja.wikipedia.org/wiki/ èŸæžåŒé åº ↩ https://github.com/php/php-src/blob/94d96b3c979a60e47abe209506c3947a16abff40/Zend/zend_operators.c#L2684 ↩ https://github.com/php/php-src/blob/94d96b3c979a60e47abe209506c3947a16abff40/Zend/zend_operators.c#L1976 ↩ https://github.com/php/php-src/blob/94d96b3c979a60e47abe209506c3947a16abff40/ext/intl/collator/collator_sort.c#L51 ↩ https://unicode-org.github.io/icu/userguide/collation/api.html#compare ↩ https://github.com/php/php-src/blob/94d96b3c979a60e47abe209506c3947a16abff40/ext/intl/collator/collator_sort.c#L168 ↩