- ベストアンサー
PHPで配列の内容を読みごとに分ける方法
- PHPのバージョン5.2.5を使用して、ある配列の内容(ひらがな)を読み(あ行~わ行)で分けて新しい配列に代入する方法を教えてください。
- 具体的には、与えられた配列から、各読みごとに要素をグループ化した新しい配列を作成したいです。例えば、[おれんじ, あか, きいろ, みどり, きみどり, くろ, しろ, ぴんく, びりじあん]のような配列から、[あ行 => [おれんじ, あか], か行 => [きいろ, きみどり, くろ], ま行 => [みどり], さ行 => [しろ], は行 => [ぴんく, びりじあん]]のような新しい配列を作成したいです。
- どのようにすれば、PHPで配列の内容を読みごとに分けることができるのでしょうか?ご教示いただけませんか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
文字コードが UTF-8 なら下記のプログラムで上手く行きました $result が仕分け後の配列になります $iro = array('おれんじ','あか','きいろ','みどり','きみどり','くろ','しろ','ぴんく','びりじあん'); $kana = array( "あ行" => "[あ-お]", "か行" => "[か-こが-ご]", "さ行" => "[さ-そざ-ぞ]", "た行" => "[た-とだ-ど]", "な行" => "[な-の]", "は行" => "[は-ほば-ぼぱ-ぽ]", "ま行" => "[ま-も]", "や行" => "[や-よ]", "ら行" => "[ら-ろ]", "わ行" => "[わ-ん]", "その他" => ".*" ); $result = array(); foreach ($iro as $value) { $match = false; foreach ($kana as $index => $pattern) { if (preg_match("/^" . $pattern . "/u", $value)) { $result[$index][] = $value; $match = true; break; } } } print_r($result);
その他の回答 (2)
- yambejp
- ベストアンサー率51% (3827/7415)
ためしにこんな感じで・・・ mb_internal_encodingで正しい文字コードを指定してください <?PHP mb_internal_encoding("EUC-JP"); function gyouwake($iro = NULL){ foreach((array) $iro as $val){ $str=mb_substr(mb_convert_kana(mb_substr($val,0,1),"hk"),0,1); $replace_of = array('ア','イ','ウ','エ','オ', 'カ','キ','ク','ケ','コ', 'サ','シ','ス','セ','ソ', 'タ','チ','ツ','テ','ト', 'ナ','ニ','ヌ','ネ','ノ', 'ハ','ヒ','フ','ヘ','ホ', 'マ','ミ','ム','メ','モ', 'ヤ','ユ','ヨ', 'ラ','リ','ル','レ','ロ', 'ワ','ヲ','ン'); $replace_by = array('あ行','あ行','あ行','あ行','あ行', 'か行','か行','か行','か行','か行', 'さ行','さ行','さ行','さ行','さ行', 'た行','た行','た行','た行','た行', 'な行','な行','な行','な行','な行', 'は行','は行','は行','は行','は行', 'ま行','ま行','ま行','ま行','ま行', 'や行','や行','や行', 'ら行','ら行','ら行','ら行','ら行', 'わ行','わ行','わ行'); $gyo=in_array($str,$replace_of)?str_replace($replace_of,$replace_by,$str):"その他"; $array[$gyo][]=$val; } return $array; } $iro = array('おれんじ','あか','きいろ','みどり','きみどり','くろ','しろ','ぴんく','びりじあん','ミズイロ','無色'); print "<pre>"; print_r(gyouwake($iro)); print "</pre>"; ?>
お礼
ご回答ありがとうございます 参考にさせていただき、希望どおりに出来ました。 ありがとうございました。
- mtaka2
- ベストアンサー率73% (867/1179)
以下のコードでどうでしょうか。 ・基本的には、array('あ'=>'あ行', 'い'=>'あ行',…)という、50音の各文字から、分類したい「行名」への配列を作成 ・分類したい各文字列から、最初の1文字を抜き出して、それから行名に変換、それを添え字とする配列要素に追加 といった処理を行っています。 ---ここから--- function syllabary_grouping($data) { $syllabary_base = array( 'あいうえお', 'かきくけこがぎぐげご', 'さしすせそざじずぜぞ', 'たちつてとだぢづでど', 'なにぬねの', 'はひふへほぱぴぷぺぽばびぶべぼ', 'まみむめも', 'やゆよ', 'らりるれろ', 'わをん'); $syllabary = array(); foreach ($syllabary_base as $s) { $len = mb_strlen($s); $c = mb_substr($s,0,1); for ($i = 0; $i < $len; $i++) { $syllabary[mb_substr($s,$i,1)] = $c.'行'; } } print_r($syllabary); $result = array(); foreach ($data as $element) { $c = $syllabary[mb_substr($element, 0,1)]; $result[$c][] = $element; } return $result; } $iro = array('おれんじ','あか','きいろ','みどり','きみどり','くろ','しろ','ぴんく','びりじあん'); print_r(syllabary_grouping($iro)); ---ここまで---
お礼
ご回答ありがとうございます 参考にさせていただき、希望どおりに出来ました。 ありがとうございました。
お礼
ご回答ありがとうございます おかげさまで、希望どおりに出来ました。 ありがとうございました。