プロが教える店舗&オフィスのセキュリティ対策術

PHPで、ある配列の内容(ひらがな)を、読み(あ行~わ行)で分けて配列に代入したいのですがどのようにすればよいかわかりません。
どなたかご教示いただけませんでしょうか?
PHPのバージョンは5.2.5です。

具体的には以下のようにしたいです。


$iro = array('おれんじ','あか','きいろ','みどり','きみどり','くろ','しろ','ぴんく','びりじあん');

↑この配列から、↓このようにしたいです。
 
Array
(
 [あ行] => Array
  (
   [0] => おれんじ
   [1] => あか
  )
 [か行] => Array
  (
   [0] => きいろ
   [1] => きみどり
   [2] => くろ
  )
 [ま行] => Array
  (
   [0] => みどり
  )
 [さ行] => Array
  (
   [0] => しろ
  )
 [は行] => Array
  (
   [0] => ぴんく
   [1] => びりじあん
  )
)

A 回答 (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);
    • good
    • 3
この回答へのお礼

ご回答ありがとうございます
おかげさまで、希望どおりに出来ました。
ありがとうございました。

お礼日時:2011/04/16 11:09

ためしにこんな感じで・・・


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>";

?>
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます
参考にさせていただき、希望どおりに出来ました。
ありがとうございました。

お礼日時:2011/04/16 11:10

以下のコードでどうでしょうか。


・基本的には、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));
---ここまで---
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます
参考にさせていただき、希望どおりに出来ました。
ありがとうございました。

お礼日時:2011/04/16 11:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!