【最大10000ポイント】当たる!!質問投稿キャンペーン!

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

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

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

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


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

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


 

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

A 回答 (3件)

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'];
}

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

なるほど!

if(mb_ereg("^[○-○]",$array['kana'])) $rows[$key]['gyo']='○行';をしてから、
if($pregyo!=$array['gyo']) print($array['gyo']."<br>\n"); と $pregyo=$array['gyo']; ですか。

大変参考になりました、どうもありがとうございました。



PS: なんの不具合だか、メイン部分が広告の下にきちゃってますね。画面を見た時に真っ白で何度もリロードを・・・。

お礼日時:2007/02/12 18:46

自分だったら


http://ja.wikipedia.org/wiki/%E6%9C%A8%E6%A7%8B% …(%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0)
多分木を応用して使うかな。

この回答への補足

すいません。
実力不足のためどのように応用して使えばよいのかが、私にはわかりません。

補足日時:2007/02/12 18:22
    • good
    • 0

○行に関しては○行に関しては全部書く方法しか自分は知りませんが


あならそのあに続く言葉に関してはワイルドカードを使えばすむ。

この回答への補足

すいません、説明がわかりにくかったようです。

お聞きしたいのは、ワイルドカード等を使いsqlで条件検索した後のphpでの処理になります。

例えば、データベースで以下のフィールドがあった場合。

name = 名前
kana = ひらがなでのふりがな
age = 年齢

$sql = " SELECT name FROM test WHERE age='20' ORDER BY kana ";
$rst = mysql_query($sql,$db);
while($col= mysql_fetch_array($rst)){
print$col["name"];
}

sqlをこのように発行すると、あいうえお順で名前が並びます。

安藤
伊藤
遠藤
佐藤
長野

この配列データーにPHPの処理を加えて

あ行
 安藤
 伊藤
 遠藤
さ行
 佐藤
な行
 長野

このように表示したいと思い質問いたしました。

配列時に処理しやすいように、INSERTの時点でkanaは『ぁ→あ』『が→か』のように濁点・小文字などは無くしています。

補足日時:2007/02/12 01:01
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

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

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

Q読み(あ行~わ行)ごとに分ける方法

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

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


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

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

Aベストアンサー

文字コードが 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);

文字コードが UTF-8 なら下記のプログラムで上手く行きました
$result が仕分け後の配列になります


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

$kana = array(
"あ行" => "[あ-お]",
"か行" => "[か-こが-ご]",
"さ行" => "[さ-そざ-ぞ]",
"た行" => "[た-とだ-ど]",
"な行" => "[な-の]",
"は行" => "[は-ほば-ぼぱ-ぽ]",
"ま行" => "[ま-も]",
"や行" => "[や-よ]",
"ら行" => "[ら-ろ]",
"わ行" => "[わ-ん]",
"その他" => ".*"
);

$result = ar...続きを読む

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

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

お世話になります。

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

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

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

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

環境:
C#,MySql

Aベストアンサー

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

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

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

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型 varchar から型 numeric への変換エラー。

SQLクエリアナライザを使って、あるデータベースからLEFT JOINなどを駆使し、条件にそってデータを抽出しようと必死でやっております。
今まではうまく取得できていたのに、”型 varchar から型 numeric への変換エラー。”というエラーがでるようになりました。
前回とテーブルのデータを比較してみると、IsNULL(chrShokuhinCD,'') as chrShokuhinCDで引っ掛かっているようです。
この項目には空白(スペース)が入ったデータが最近存在しているのが原因だと思うのですが。。。
空白だったとき、IsNULL(chrShokuhinCD,'') as chrShokuhinCDはどのように修正すればよいでしょうか?教えてください。

Aベストアンサー

>空白だったとき、IsNULL(chrShokuhinCD,'') as chrShokuhinCDはどのように修正すればよいでしょうか?

では質問です。
空白だったとき、どんな数値として扱えばいいでしょうか?

これで何を入れればいいかわかると思いますが。

Qテキストボックス入力を半角英数字に制限する

よろしくお願いします。

テキストボックスに入力される文字を、
半角英数字(英語の場合は大文字のみ)以外入力できないように制限したいのですが可能でしょうか?

もしくは半角英数字以外が入力された場合アラートを出すようにしたいのですが。。。

また、文字数の制限も可能でしょうか?

第一希望)
12文字以内の半角英数大文字以外入力できないように入力制限する。

第二希望)
12文字以内の半角英数大文字以外入力の文字が入力されている状況でボタン(=CGI実行)を押すと警告のアラートが出る。

第三希望)
半角英数大文字以外入力できないように制限、もしくはアラート表示。

例)
AAAA-1234567 ○(ハイフンを含め12文字以内の半角英数字)
AAAA-123456789 ×(12文字以内でない)
aaaa-1234567 ×(小文字が含まれている)


webサーバー・・・HP-UX
web・・・IE6
開発端末・・・windows2000(Tera Term 使用)

情報をお持ちの方いらっしゃいましたら、
よろしくお願いいたします。

よろしくお願いします。

テキストボックスに入力される文字を、
半角英数字(英語の場合は大文字のみ)以外入力できないように制限したいのですが可能でしょうか?

もしくは半角英数字以外が入力された場合アラートを出すようにしたいのですが。。。

また、文字数の制限も可能でしょうか?

第一希望)
12文字以内の半角英数大文字以外入力できないように入力制限する。

第二希望)
12文字以内の半角英数大文字以外入力の文字が入力されている状況でボタン(=CGI実行)を押すと警告のアラートが...続きを読む

Aベストアンサー

第二希望の条件について。
前提としてチェックするテキストボックスのnameがtxtであった場合の説明をします。
まず、次のようにform開始タグにname="fm"とonsubmit="return checkForm()"を追加します。

<form name="fm" action="********.cgi" method="post" onsubmit="return checkForm()">


次に以下を<head>~</head>に貼り付けることで、JavaScriptによる送信前のチェックが可能です。

---------------------------------------
<script type="text/javascript">
<!--
function checkForm(){
var str = document.fm.txt.value;
if (str.match(/[^A-Z\d\-]/)) {
alert("半角英数字(大文字)しか入力できません");
return false;
}
else if (str.length > 12) {
alert("12文字以内で入力してください");
return false;
}
}
//-->
</script>
---------------------------------------

「ハイフンを含め」と書いているので、ハイフンを入れても有効なようにしました。
また、12文字以内としか書かれていないので0文字でも警告が出ないようになっています。
もし、何も入力されていない場合でも警告を出すならば、次のようにしてください。

---------------------------------------
if (!str) {
alert("何も入力されていません");
return false;
}
else if (str.match(/[^A-Z\d\-]/)) {
alert("半角英数字(大文字)しか入力できません");
return false;
}
else if (str.length > 12) {
alert("12文字以内で入力してください");
return false;
}
---------------------------------------

第二希望の条件について。
前提としてチェックするテキストボックスのnameがtxtであった場合の説明をします。
まず、次のようにform開始タグにname="fm"とonsubmit="return checkForm()"を追加します。

<form name="fm" action="********.cgi" method="post" onsubmit="return checkForm()">


次に以下を<head>~</head>に貼り付けることで、JavaScriptによる送信前のチェックが可能です。

---------------------------------------
<script type="text/javascript">
<!--
function checkForm(){
...続きを読む

Q配列をPOSTで受けとる

タイトルのまんまですが
配列をformで送って
それをPOSTで受け取りたいのですが
うまくいきません

具体的に言うと
<?php
print"<form method=POST action=action.php>";

for($i=0; $i<$n; $i++){
   print"<input type=text name=foo[$i]>";
}
print"<input type=hidden name=n value=$n>";
print"<input type=submit value=go>";
print"<form>";
?>


///////////以下action.php//////////////////
<?php
$n = $_POST["n"];
for($j=0; $j<$n; $j++){
   $foo[$j] = $_POST["foo[$j]"];
   print"$foo[$j]";
}
?>


こんな感じのことがしたいのですが
うまくいきません
どうもPOSTされてないみたいでfoo[$j]はnullです
凡ミスな気がしなくもないんですが...プログラム初心者なんで↓↓
教えてください
よろしくお願いします

タイトルのまんまですが
配列をformで送って
それをPOSTで受け取りたいのですが
うまくいきません

具体的に言うと
<?php
print"<form method=POST action=action.php>";

for($i=0; $i<$n; $i++){
   print"<input type=text name=foo[$i]>";
}
print"<input type=hidden name=n value=$n>";
print"<input type=submit value=go>";
print"<form>";
?>


///////////以下action.php//////////////////
<?php
$n = $_POST["n"];
for($j=0; $j<$n; $j++){
   $foo[$j] = $_POST["foo[$j...続きを読む

Aベストアンサー

atsuGTさんこんにちは。


受け取り側は

$foo = $_POST["foo"];

とするだけで$fooに送信された配列が格納されます。


$_POST["foo[添え字]"] ではなく、
$_POST["foo"][添え字] となります。

Qチェックボックスから複数のvalueを取り出す

HTMLフォームから、action="file.php"でデータの受け渡し→PHPで送られてきたvalueに応じて文章を出力、というプログラムを作っています。

例:
グループAのラジオボタン1にチェック、送信
→グループAで押されたラジオボタンを送信されたvalueで判別、この場合はvalue==A
→value==Aの場合に表示する文章を変数に受け渡し、その変数で表示

ラジオボタン、テキストボックスのvalueは$_POST['XXX']で取り出せたのですが、チェックボックスのデータだけが取り出せません。こちらの質問を検索したとき、多次元配列という言葉を見かけたのですが、いまいちよく分かりませんでした。
チェックボックスの複数のvalueで、上記の例のような動きを実現させるにはどうしたらいいでしょうか。どなたかご教授ください。

Aベストアンサー

チェックボックスはちょっと特殊

まずHTML部分で、以下のように定義します
<input type="checkbox" name="sample[]" value="test1">test1
<input type="checkbox" name="sample[]" value="test2">test2

ここでは、nameの部分に[]をつけるのがポイント


次にphpで受け取る方法として、
$sample = $_POST["sample"];
で問題ありません。

受け取ったデータを使うときは、$sampleは配列になっていますので、
仮に上記のtest1とtest2両方にチェックが付いているとしたら、
$sample[0]にはtest1が、$sample[1]にはtest2が入っています。

$sampleをforeachで使うか、$sampleのデータ数を調べてforでループさせるなどで使えます。

QVBA 実行時エラー1004 rangeメソッドは失敗しました。globalオブジェクトのエラー

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義がまずいと思うのですが、それ以上の事は分かりません。どなたか、分かる方がおりましたら、よろしくお願いします。また、プログラムは以下のようになります。

Sub 繰り返し()
'繰り返し
Dim s As Integer
For s = 0 To 17
Range("cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)").Select
Range("cells(8,s+2)").Activate
Charts.Add
ActiveChart.ChartType = xlXYScatter
ActiveChart.SetSourceData Source:=Sheets("20081216_210647").Range( _
"cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)"), PlotBy:=xlColumns
ActiveChart.SeriesCollection(1).Name = "=""0810p2x"""
ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="0810p2x"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "0810p2x"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "t"
.Axes(xlValue, xlPrimary).HasTitle = False
End With
Next
End Sub

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義...続きを読む

Aベストアンサー

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな(Excelで表示されている)シートが上位オブジェクトとして、自動的に認識されます。

≪例2≫
Sheets("Sheet2").Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、Rangeのみシート名が記述されています。
Sheets("Sheet2").Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
Activeなシートが、Sheet2の場合はエラーになりません。
しかし、ActiveなシートがSheet2以外の場合、エラーが発生します。
直前に、
Sheets("Sheet1").Select
などとしていれば、ActiveシートがSheet1になっていますから、エラーになります。

Sheets("Sheet2").Range(Sheets("Sheet2").Cells(8, 1), Sheets("Sheet2").Cells(1587, 2)).Select
と書いておけば安心です。
Withステートメントを使えばスッキリ纏めることができます。
With Sheets("Sheet2")
  .Range(.Cells(8, 1), .Cells(1587, 2)).Select
End With

# Sheets("Sheet2")の上位オブジェクトが省略されていることにも気がついてください。

>そこで自分で基礎を勉強したいのですが推薦できる参考書などがござ
>いましたら、教えていただけませんか?
私自身は、入門書程度の雑誌を1冊買っただけです。どれが良いとかはよく分かりません。
「マクロの記録」を活用して、参考コードを取得し、汎用性のあるコードに編集しています。
新しい単語があれば、文字カーソルを単語の上に置き、F1キーを押してVBAのヘルプを必ず見るようにしています。
躓いた時は、Web検索して欲しい情報を得たり、あるいは、こうした掲示板で先輩方のお力をお借りしています。

Excel(エクセル)VBA入門:目次
http://oshiete1.goo.ne.jp/kotaeru_reply.php3?q=4651404
エクセル入門・初級編
http://www.kenzo30.com/excel_kiso.htm

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな...続きを読む

Qhtml で 変数を定義できますか?

html(できればjava不使用)で変数に文字列をいれてつかう、またはそれに近いことはできないでしょうか?

例**************************
$color1="#000000"

<tr bgcolor=$color1>内容1<tr>
<tr bgcolor=$color1>内容2<tr>
****************************
みたいな感じです

Aベストアンサー

調べりゃ分かることは???だけど。

CSS2で無理やり作れば・・簡単だけど・・・
生成内容、自動番号振り、リスト ( http://www.swlab.it.okayama-u.ac.jp/man/rec-css2/generate.html )
 本来はXSLTで作るほうがよいかと・・・
 <th><xsl:value-of select="parson" />の歌</th>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=Shift_JIS">
<title>サンプル</title>
<meta name="author" content="ORUKA1951">
<meta http-equiv="Content-Style-Type" content="text/css">
<link rev="made" href="mailto:orika1951@hoge.com" title="send a mail" >
<link rel="START" href="../index.html">
<style type="text/css">
<!--
.parson1:before{content:"田中";}
p.age1:after{content:"36歳";}
-->
</style>
</head>
<body>
<h1>サンプル</h1>
<p class="parson1">は男の子</p>
<p class="parson1 age1">の年齢は</p>
<p>私の彼氏は<span class="parson1">君だよ</p>
</body>
</html>

調べりゃ分かることは???だけど。

CSS2で無理やり作れば・・簡単だけど・・・
生成内容、自動番号振り、リスト ( http://www.swlab.it.okayama-u.ac.jp/man/rec-css2/generate.html )
 本来はXSLTで作るほうがよいかと・・・
 <th><xsl:value-of select="parson" />の歌</th>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=Shift_JIS">
<title>サンプル</title>
<met...続きを読む


人気Q&Aランキング