回答編集履歴

4 加筆修正

m6u

m6u score 13866

2018/06/01 21:48  投稿

なんか間違った回答を投稿した気がするけど、見直しました。
あ行の置き換えを最後に回すしか無いと考えます。
kaのaを先に置き換えてしまうとkなど子音のみ残ってしまうのは当たり前です。
```php
<?php
function to_kana($str, $romaji, $kana){
   $patterns = [];
   foreach($romaji as $value){
       $patterns[] = '/' . $value . '/';
   }
   $str = preg_replace($patterns, $kana, $str);
   return $str;
}
$kana = [
   'か', 'き', 'く', 'け', 'こ',
   'あ', 'い', 'う', 'え', 'お', // あ行は最後!
];
$romaji = [
   'ka', 'ki', 'ku', 'ke', 'ko',
   'a', 'i', 'u', 'e', 'o', // あ行は最後!
];
$str = "aki"; // あき 
$str = to_kana($str, $romaji, $kana);
echo $str;
```
《実行結果》
![イメージ説明](e222f7a8254dd0ac901d095cb18ca6b3.png)
正規表現パターンを駆使しないので、
preg_replace()でなくstr_replace()の方が少しでも処理が早くなる。
```php
<?php
function to_kana($str, $romaji, $kana){
   //$patterns = [];
   //foreach($romaji as $value){
   //   $patterns[] = '/' . $value . '/';
   //}
   //$str = preg_replace($patterns, $kana, $str);
   $str = str_replace($romaji, $kana, $str);
   return $str;
}
$kana = [
   'か', 'き', 'く', 'け', 'こ',
   'あ', 'い', 'う', 'え', 'お',
];
$romaji = [
   'ka', 'ki', 'ku', 'ke', 'ko',
   'a', 'i', 'u', 'e', 'o',
];
$str = "aki"; // あき 
$str = to_kana($str, $romaji, $kana);
echo $str;
```
```
もしもこの先ローマ字領域全体に拡張するとなると、
'pya'みたいな3文字使うものを配列の先の方に置いて、
'n'はあ行らといっしょでいいかもしれません。
(「ん」をnnとするかnとするか、kaniを「かに」にせず「かんい」にするためのローマ字の工夫とか、検討事項はまだあるけども。)
3 加筆修正

m6u

m6u score 13866

2018/06/01 19:41  投稿

なんか間違った回答を投稿した気がするけど、見直しました。
あ行の置き換えを最後に回すしか無いと考えます。
kaのaを先に置き換えてしまうとkなど子音のみ残ってしまうのは当たり前です。
```php
<?php
function to_kana($str, $romaji, $kana){
   $patterns = [];
   foreach($romaji as $value){
       $patterns[] = '/' . $value . '/';
   }
   $str = preg_replace($patterns, $kana, $str);
   return $str;
}
$kana = [
   'か', 'き', 'く', 'け', 'こ',
   'あ', 'い', 'う', 'え', 'お', // あ行は最後!
];
$romaji = [
   'ka', 'ki', 'ku', 'ke', 'ko',
   'a', 'i', 'u', 'e', 'o', // あ行は最後!
];
$str = "aki"; // あき 
$str = to_kana($str, $romaji, $kana);
echo $str;
```
《実行結果》
![イメージ説明](e222f7a8254dd0ac901d095cb18ca6b3.png)
![イメージ説明](e222f7a8254dd0ac901d095cb18ca6b3.png)
正規表現パターンを駆使しないので、
preg_replace()でなくstr_replace()の方が少しでも処理が早くなる。
```php
<?php
function to_kana($str, $romaji, $kana){
   //$patterns = [];
   //foreach($romaji as $value){
   //   $patterns[] = '/' . $value . '/';
   //}
   //$str = preg_replace($patterns, $kana, $str);
   $str = str_replace($romaji, $kana, $str);
   return $str;
}
$kana = [
   'か', 'き', 'く', 'け', 'こ',
   'あ', 'い', 'う', 'え', 'お',
];
$romaji = [
   'ka', 'ki', 'ku', 'ke', 'ko',
   'a', 'i', 'u', 'e', 'o',
];
$str = "aki"; // あき 
$str = to_kana($str, $romaji, $kana);
echo $str;
```
2 加筆修正

m6u

m6u score 13866

2018/06/01 19:17  投稿

なんか間違った回答を投稿した気がするけど、見直しました。
あ行の置き換えを最後に回すしか無いと考えます。  
kaのaを先に置き換えてしまうとkなど子音のみ残ってしまうのは当たり前です。  
 
```php
<?php
function to_kana($str, $romaji, $kana){
   $patterns = [];
   foreach($romaji as $value){
       $patterns[] = '/' . $value . '/';
   }
   $str = preg_replace($patterns, $kana, $str);
   return $str;
}
$kana = [
   'か', 'き', 'く', 'け', 'こ',
   'あ', 'い', 'う', 'え', 'お', // あ行は最後!
];
$romaji = [
   'ka', 'ki', 'ku', 'ke', 'ko',
   'a', 'i', 'u', 'e', 'o', // あ行は最後!
];
$str = "aki"; // あき 
$str = to_kana($str, $romaji, $kana);
echo $str;
```
《実行結果》
![イメージ説明](e222f7a8254dd0ac901d095cb18ca6b3.png)
1 見直し

m6u

m6u score 13866

2018/06/01 19:15  投稿

str_replace()で十分な案件
なんか間違った回答を投稿した気がするけど、見直しました
```php
<?php
function to_kana($str, $romaji, $kana){
   $patterns = [];
   //foreach($romaji as $value){
   //   $patterns[] = '/' . $value . '/';
   //}
   foreach($romaji as $value){
      $patterns[] = '/' . $value . '/';
   }
   //$str = preg_replace($patterns, $kana, $str);
   $str = str_replace($patterns, $kana, $str);
   $str = preg_replace($patterns, $kana, $str);
   return $str;
}
$kana = [
   'あ', 'い', 'う', 'え', 'お',  
   'か', 'き', 'く', 'け', 'こ',
   'あ', 'い', 'う', 'え', 'お', // あ行は最後!  
];
$romaji = [
   'a', 'i', 'u', 'e', 'o',  
   'ka', 'ki', 'ku', 'ke', 'ko',
   'a', 'i', 'u', 'e', 'o', // あ行は最後!  
];
$str = "aki"; // あき 
$str = to_kana($str, $romaji, $kana);
echo $str;
```
《実行結果》
![実行結果](9e5ca3fe466191540af9a555aa3fe92a.png)
![イメージ説明](e222f7a8254dd0ac901d095cb18ca6b3.png)

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る