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

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


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

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

このQ&Aに関連する最新のQ&A

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
    • 2
この回答へのお礼

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

お礼日時: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に関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qsqlのデーターを『あ行』『か行』・・と区切りたい

sqlの条件検索で取得した任意の配列データー(すべてひらがな)

あき、あり、いか、きのこ、けーき、たぬき、たわし・・・

を『あ行』、『か行』、・・と区切って表示したく悩んでいます。

あ行
  あき
  あり
  いか
か行
  きのこ
  けーき
た行
  たぬき
  たわし
(以下略)


行ごとにマッチする文字があるかないか判定して、SELECTをすればできないことはないのですが、それではあまりに効率が悪いような気がします。

効率のよさそうなソースがわかる方がいましたら、ぜひ教えてください。よろしくお願いします。


 

Aベストアンサー

mb_eregなどで調整する手もあります

<?PHP
$rows[]=Array('name'=>'安藤','kana'=>'あんどう','age'=>18);
$rows[]=Array('name'=>'伊藤','kana'=>'いとう' ,'age'=>20);
$rows[]=Array('name'=>'遠藤','kana'=>'えんどう','age'=>15);
$rows[]=Array('name'=>'佐藤','kana'=>'さとう' ,'age'=>30);
$rows[]=Array('name'=>'長野','kana'=>'ながの' ,'age'=>40);

foreach($rows as $key=>$array){
if(mb_ereg("^[あ-お]",$array['kana'])) $rows[$key]['gyo']='あ行';
if(mb_ereg("^[か-こ]",$array['kana'])) $rows[$key]['gyo']='か行';
if(mb_ereg("^[さ-そ]",$array['kana'])) $rows[$key]['gyo']='さ行';
if(mb_ereg("^[た-と]",$array['kana'])) $rows[$key]['gyo']='た行';
if(mb_ereg("^[な-の]",$array['kana'])) $rows[$key]['gyo']='な行';
if(mb_ereg("^[は-ほ]",$array['kana'])) $rows[$key]['gyo']='は行';
if(mb_ereg("^[ま-も]",$array['kana'])) $rows[$key]['gyo']='ま行';
if(mb_ereg("^[や-よ]",$array['kana'])) $rows[$key]['gyo']='や行';
if(mb_ereg("^[ら-ろ]",$array['kana'])) $rows[$key]['gyo']='ら行';
}

$pregyo="";
foreach($rows as $key=>$array){
if($pregyo!=$array['gyo']) print($array['gyo']."<br>\n");
print $array['name']."<br>\n";
$pregyo=$array['gyo'];
}

?>

mb_eregなどで調整する手もあります

<?PHP
$rows[]=Array('name'=>'安藤','kana'=>'あんどう','age'=>18);
$rows[]=Array('name'=>'伊藤','kana'=>'いとう' ,'age'=>20);
$rows[]=Array('name'=>'遠藤','kana'=>'えんどう','age'=>15);
$rows[]=Array('name'=>'佐藤','kana'=>'さとう' ,'age'=>30);
$rows[]=Array('name'=>'長野','kana'=>'ながの' ,'age'=>40);

foreach($rows as $key=>$array){
if(mb_ereg("^[あ-お]",$array['kana'])) $rows[$key]['gyo']='あ行';
if(mb_ereg("^[か-こ]",$arr...続きを読む

Qillegal string offset

php5.3では動いていたプログラムをphp 5.4 で動かしたらwarning illegal string offsetが出て困っています。以下のプログラムでwarningが出ないようにするにはどのようにコーディングすればよいのでしょうか?


$a = array('exists' => 'foo');
if ($a['exists']['non_existent']) {
print 1;
}
print 2;
exit;

Aベストアンサー

isset()を使えばいいと思います

Qリンクをクリックした時にformからPOST送信したい。

HTML、PHP、JavaScript等でサイトを作っているのですが・・・。

【実現出来ている例】
<form name="form1" method="post" action="Next.php" onSubmit="return InputCheck()">
 <input type="submit" value="送信">
</form>
 submitボタンを一つ置いて、それがクリックされた場合に
formの内容をPOSTで送信する。

【実現したい例】
<form name="form1 method="post">
 <a href="Next.php" onClick="???">???</a>
</form>
 formの中のリンクをクリックされた場合に、formの内容を
POSTで送信したいのですが、その実現方法がわかりません。
GETで送るという手もあり得ますが、今回はどうしてもPOST
したいのですが。

Aベストアンサー

<form name="form1" method="post" action="Next.php">
<a href="#" onClick="document.form1.submit();">???</a>
</form>

onclick内の対象がform1としてあてているので、
アンカータグは別にform内に記述しなくても大丈夫です

form内にhidden等でnameとvalueを持ったパラメータがあればそれも送られます

アンカータグから動的にvalueを変更したい場合は、
document.form1.hogename.value = 'hoge';
等をsubmit()の前に行えば可能です

ただしform内に
<input type="hidden" name="hogename" value="">
を記述する等、変更先パラメータの元を用意する必要がありますのでご注意下さい

Q【MySQL】where句で正規表現のようなものありますか?

お世話になっております。

やりたい事は、例えば`title`フィールドの
頭文字が“あ行”のものとか、
頭文字がアルファベットの(またはアルファベットでない)ものとか
の抽出です。

今は地道に
where title like 'あ%' or title like 'い%' or ・・・・・・(~お迄)
等とやっています。
“は行”なんかは濁点や半濁点も含め15個つなげています。。

簡単な方法がございましたらご教示願いたいです。
宜しくお願い致します。

Aベストアンサー

mysqlの正規表現は日本語の対応が不正確なので苦労しますね。
一応、こうすればいけそうです。

○ `title` REGEXP '^(あ|い|う|え|お)'

しかしこんなやり方はできません。

× `title` REGEXP '^(あ-お)'

先頭か末尾のマッチはいけそうですが、文字列の中間となると
文字コードの合間にマッチすることがあるので、不正確になります。

私は使ったことがないので手放しにお勧めできませんが、
mregexp拡張など日本語版正規表現もあるようです。
参考までに

http://www.irori.org/tool/mregexp.html

Qforeachで回った数を表示したい

単純な質問ですみません。
====
//getTestlistは別ファイルで定義済み。
<?
$testlist=getTestlist();
foreach($testlist as $test){
?>


<? } ?>
====
例えば↑こんなふうにforeachで$testlistが存在するだけ回したとします。
そのときに何回まわったか?($testが何件あったか?)だけを表示したいのですが、そんなことってできますか?
表示したい位置は<? } ?>の外側にと考えています。
あさってな質問でしたらすみません。
phpVer 4.3

よろしくお願いいたします。

Aベストアンサー

<?
$testlist=getTestlist();
$n=0;
foreach($testlist as $test){
$n++;
?>
<?}?>

<?=$n?>回
とかでよいかと思います。

途中でbreakなどが無ければ
<? echo count($testlist) ?>でも良いかも知れません。

Q”あかさたな”で検索したい

お世話になります。

会社名と会社名フリガナがフィールドに存在しています。

そこで、”あかさたなはまやらわ全”で該当するレコードを
検索したいのですが、どのようなクエリを発行すればよいのか
解りません。

どなたか、ご教示いただけませんでしょうか。
よろしくおねがいしますT-T

例:
フォームには、”あかさたなはまやらわ全”11個のボタンが付いて
おりクリックすると、検索結果が表示される。

環境:
C#,MySql

Aベストアンサー

一番効率がいいのは
会社名フリガナフィールドの他に一文字フリガナフィールドをつくって
登録することです。

そうでないなら、カ行なら
(`フリガナ` LIKE 'カ%' OR `フリガナ` LIKE 'キ%' OR ・・・)
のようにするのがSQL的には効率的です。
ただし濁音・半濁音がある場合は列記する必要があります

もちろんフリガナの最初の一文字をとって
left(フリガナ,1) IN ('カ','キ','ク','ケ','コ')
のような書き方もできますが、インデックスが効かない分スピードは遅いです。
(データ数が数千件レベルならこれでも十分いけるとおもいます)

Qjavascriptでセレクトボックスの"selected"を動的につ

javascriptでセレクトボックスの"selected"を動的につける方法について質問させてください。

現在、以下のようなフォームを作成しました。

<select name='year'>
<option value='2010'>2010</option>
<option value='2011'>2011</option>
</select>年

<select name='month'>
<option value='1'>1</option>
<option value='2'>2</option>
<option value='3'>3</option>
<option value='4'>4</option>
<option value='5'>5</option>
<option value='6'>6</option>
<option value='7'>7</option>
<option value='8'>8</option>
<option value='9'>9</option>
<option value='10'>10</option>
<option value='11'>11</option>
<option value='12'>12</option>
</select>月

<select name='day'>
<option value='1'>1</option>
<option value='2'>2</option>
<option value='3'>3</option>
<option value='4'>4</option>
<option value='5'>5</option>
<option value='6'>6</option>
<option value='7'>7</option>
<option value='8'>8</option>
<option value='9'>9</option>
<option value='10'>10</option>
<option value='11'>11</option>
<option value='12'>12</option>
<option value='13'>13</option>
<option value='14'>14</option>
<option value='15'>15</option>
<option value='16'>16</option>
<option value='17'>17</option>
<option value='18'>18</option>
<option value='19'>19</option>
<option value='20'>20</option>
<option value='21'>21</option>
<option value='22'>22</option>
<option value='23'>23</option>
<option value='24'>24</option>
<option value='25'>25</option>
<option value='26'>26</option>
<option value='27'>27</option>
<option value='28'>28</option>
<option value='29'>29</option>
<option value='30'>30</option>
<option value='31'>31</option>
</select>日


このセレクトボックスに、例えば今日の日付"2010年9月30日"だったら、それぞれの年、月、日の<option>に"selected"をつけたいのですが、javascriptではどのようにして実現したら良いのでしょうか?

よろしくお願いします。

javascriptでセレクトボックスの"selected"を動的につける方法について質問させてください。

現在、以下のようなフォームを作成しました。

<select name='year'>
<option value='2010'>2010</option>
<option value='2011'>2011</option>
</select>年

<select name='month'>
<option value='1'>1</option>
<option value='2'>2</option>
<option value='3'>3</option>
<option value='4'>4</option>
<option value='5'>5</option>
<option value='6'>6</option>
<option value='7'>7</option>
<option value='8...続きを読む

Aベストアンサー

こんな感じで・・・

<script>
window.onload=function(){
var f=document.getElementById("f0");
var ymd=new Date();
checkSelect(f.elements["year"],ymd.getFullYear());
checkSelect(f.elements["month"],ymd.getMonth() +1);
checkSelect(f.elements["day"],ymd.getDate());
}
function checkSelect(obj,val){
for(var i=0;i<obj.length;i++){
if(obj[i].value==val){
obj[i].selected=true;
break;
}
}
}
</script>
<form id="f0">
<div>
<select name='year'>
<option value='2009'>2009</option>
<option value='2010'>2010</option>
<option value='2011'>2011</option>
</select>年

<select name='month'>
<option value='8'>8</option>
<option value='9'>9</option>
<option value='10'>10</option>
</select>月

<select name='day'>
<option value='29'>29</option>
<option value='30'>30</option>
<option value='31'>31</option>
</select>日
</div>
</form>

こんな感じで・・・

<script>
window.onload=function(){
var f=document.getElementById("f0");
var ymd=new Date();
checkSelect(f.elements["year"],ymd.getFullYear());
checkSelect(f.elements["month"],ymd.getMonth() +1);
checkSelect(f.elements["day"],ymd.getDate());
}
function checkSelect(obj,val){
for(var i=0;i<obj.length;i++){
if(obj[i].value==val){
obj[i].selected=true;
break;
}
}
}
</script>
<form id="f0">
<div>
<select name='year'>
<opt...続きを読む

QJSONデータを50音順でソートしたい

下記のようなJSONデータを50音順でソートしたいのですが、
どうすれば良いでしょうか?

{
 "human": {
 "artist": [
  {
  "link": "goo1.html",
  "name": "小田 和正",
  "yomi": "おだかずまさ"
  },
  {
  "link": "goo2.html",
  "name": "岩佐美咲",
  "yomi": "いわさみさき"
  },
  {
  "link": "goo3.html",
  "name": "指原莉乃",
  "yomi": "しのはらりの"
  },
 ]
 }
}

Aベストアンサー

javascriptには配列をソートするメソッドがありますので、それを利用すればよろしいかと。


例えば、yomi順にソートする例
(以下の例では、直接並び替えずにtest配列に移し変えてソートしています)

var json = {
 "human": {
  "artist": [
   {
    "link": "goo1.html",
    "name": "小田 和正",
    "yomi": "おだかずまさ"
   },
   {
    "link": "goo2.html",
    "name": "岩佐美咲",
    "yomi": "いわさみさき"
   },
   {
    "link": "goo3.html",
    "name": "指原莉乃",
    "yomi": "しのはらりの"
   }
  ]
 }
};


// 並べ替え用の配列に格納
var i, test = [];
var artist = json.human.artist;
var n = artist.length;

for(i=0; i<n; i++)
 test[i] = [ artist[i].yomi, artist[i] ];


// 並べ替え
test.sort();
for(i=0; i<n; i++)
 test[i] = test[i][1];


// 結果をテスト表示してみる
var t, result = "";
for(i=0; t=test[i++];)
 result += (result?"\n":"") + "link=" + t.link + " / name=" + t.name + " / yomi=" + t.yomi;

alert(result);

javascriptには配列をソートするメソッドがありますので、それを利用すればよろしいかと。


例えば、yomi順にソートする例
(以下の例では、直接並び替えずにtest配列に移し変えてソートしています)

var json = {
 "human": {
  "artist": [
   {
    "link": "goo1.html",
    "name": "小田 和正",
    "yomi": "おだかずまさ"
   },
   {
    "link": "goo2.html",
    "name": "岩佐美咲",
    "yomi": "いわさみさき"
   },
   {
    "link": "goo3.html",...続きを読む

Q五十音表示したいのですが、SQL、PHP、どっち?

MySQLからデータ取得して五十音表示させたいのですが、「SQL」「PHP」、どちらをメインでやれば良いか分かりません

■やりたいこと
・「あ行」「か行」ではなく、単純に「あ」「い」「う」毎に分けて、取得結果を1ページに表示させたいです

■思いついた方法
1.「あ」「い」「う」… と、それぞれ50回selectして、表示
2.1度SELECTした後、if文で、ひたすら条件分岐して表示

・どちらが良いでしょうか?
・他に何か良い方法はあるでしょうか?

Aベストアンサー

僕の場合は一旦全部取得してから
substr()で1文字目をkeyとして取得しながら
array('あ'=>array(....),'い'=>array(....));
ってカンジの二次配列に格納していき
それを回して出力するってやり方します

理由はデータをオブジェクト化しとくと使い回しやすい
バグが起きた時にデータ取得でつまづいたか出力でつまづいたか調べやすい
出力形態変更するとき変更しやすいからです

QMySQLで改行を含む文の登録のしかた(改行コード

MySQLで改行を含む文を登録したいんですが、改行を改行コードに書き換えて登録したいです。
改行コードはどのように書けばいいですか?

登録したい文:
あいうえお
かきくけこ
さしすせそ

Aベストアンサー

改行コードは¥nで登録すれば良いです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング