• ベストアンサー

配列データのグループ別け

こんばんは。お世話になっております。 下記のような配列があり、各データの先頭にある番号(02_01とか)をグループごとに別けてカウントしたいのですが、この場合どのような手順で行ったら良いのでしょうか? Array ( [0] => 02_01 斉藤 ***@***.com [1] => 02_02 高木 ***@***.net [2] => 02_03 佐藤 ***@***.ne.jp [3] => 01_01 高橋 ***@***.com [4] => 02_01 鈴木 ***@***.co.jp [5] => 02_01 池田 ***@***.net [6] => 02_02 山田 ***@****.com ) ※上記各データのスペースは、全角スペースにて記述してますが、実際はタブ区切りとなっています。 やりたいこと、その1 以下のように、各グループ単位での件数を取得したい。 02_01 3件 02_02 2件 02_03 1件 01_01 1件 やりたいこと、その2 その1で別けた結果が何パターンあるか?を知りたく、上記例の場合、結果を4と返したい。 教えて君のようで恐縮ですが、色々と調べてはいるものの、DBでいうgroup by 句のような使い方が判らず、質問させていただきました。 お忙しい中恐縮ですが、アドバイスのほど宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

たとえばこんな感じで集計してみては? <? $a=Array ( "02_01 斉藤 ***@***.com" ,"02_02 高木 ***@***.net" ,"02_03 佐藤 ***@***.ne.jp" ,"01_01 高橋 ***@***.com" ,"02_01 鈴木 ***@***.co.jp" ,"02_01 池田 ***@***.net" ,"02_02 山田 ***@****.com" ); foreach($a as $val){ if(preg_match("/(.*?)\t(.*)$/",$val,$match)) $b[$match[1]][]=$match[2]; } foreach($b as $key=>$vals){ print $key.":".count($vals)."件<br>"; } print "全体:".count($b)."件"; ?>

mayu_chap
質問者

お礼

yambejpさんへ こんにちは。お世話になっております。投函後の早速のお返事を有難う御座います。 No1のUmJammerさんからご指導いただいた流れと同じようですが、考え方としてはもちろん、具体的なソースをご提示してくださり、とても感謝しております。 もちろん、これで解決出来ました!有難う御座いました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • UmJammer
  • ベストアンサー率58% (115/196)
回答No.1

foreachなどのループ処理で最初に挙げられた配列の全てをあたって、「やりたいこと、その1」の形の連想配列を作れば、とりあえず所望の処理は実現できると思います。 この場合、「やりたいこと、その2」はcount関数でその連想配列の要素数を取得すればよいことになります。

mayu_chap
質問者

お礼

UmJammerさんへ はじめまして、こんにちは。投函後、早速のお返事を有難う御座います。 No2のyambejpさんが具体的なソースを書いて下さりましたが、考え方として、とても貴重なアドバイスと思っております。有難う御座いました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • X個グループからY個ずつデータを抽出したい

    例:グループの数は100ぐらいがあって、グループごとのレコード数はそれぞれであり、毎回そのうちのX(例3)グループずつにデータを抽出します。そして1つのグループから最大Y個(例2)のデータを抽出します。 抽出したデータにフラグを立てて、次の抽出時に除外の条件として使います。 例:以下のテーブルがあって、毎回3グループから2個のデータを抽出します: group name flag ---------------------------------------------------------------------------- 1_group 田中A          0     1_group 佐藤A          0     1_group 林A           0     1_group 鈴木A           0     1_group 牧野A           0     2_group 平田B          0     2_group 小林B          0     ・・・ 3_group 高橋C          0     3_group 丹羽C          0     3_group 田中C          0     3_group 佐藤C          0     3_group 鈴木C          0     3_group 吉田C          0     ・・・ 4_group 高橋D          0     4_group 丹羽D          0     4_group 田中D          0     4_group 佐藤D          0     4_group 鈴木D          0     ・・・ (1)1回目の抽出の結果 group name flag ---------------------------------------------------------------------------- 1_group 田中A          0     1_group 佐藤A          0     2_group 平田B          0     2_group 小林B          0     3_group 高橋C          0     3_group 丹羽C          0     (2)2回目の抽出の結果 group name flag ---------------------------------------------------------------------------- 1_group 林A           0     1_group 鈴木A           0     3_group 田中C          0     3_group 佐藤C          0     4_group 高橋D          0     4_group 丹羽D          0     (3)3回目の抽出の結果 group name flag ---------------------------------------------------------------------------- 1_group 牧野A           0     3_group 鈴木C          0     3_group 吉田C          0     4_group 田中D          0     4_group 佐藤D          0     DBはSqlLiteです。 長いですが、ご教授頂ければ、ありがたいです

  • 配列データの書換え

    お世話になっております。 タイトルにある「配列データの書換え」ですが、あるデータ用ファイル(data.txt)というのがあり、 2009-07-07 ○○@○○.com たけし no 2009-07-07 △△@○△.net ゆみこ no 2009-07-08 ○△@□○.org ひろし ok ※全角スペースの箇所は、タブ区切りとなっています。 と構成されているファイルを呼び出し、条件にて処理を行いたく、呼び出したデータ(data.txtのデータ)を配列にし、 for($i;$i<count($datafile);$i++){  $data = explode("\t", $datafile[$i]);   if($data[3] == "ok"){//ok,noだけではなく、他の条件も含めて条件処理を行っている    $str = "no";    $up_data[] = $data[0]."\t".$data[1]."\t".$data[2]."\t".$str;   } } とこんな感じで記述してみました。 これは、if文の中で条件が合致していたら、名前の後(data.txt)にある「no」を「ok」とし、 その書換えたデータをもとに、data.txtをも上書きしたいと考えているのですが、 この方法だと、data.txtのデータが増えて来たとき、効率が悪いように思えてなりません。 上記のような流れの処理を行い、元のファイルのデータを処理&上書きするもっと効率のよい スクリプトはどんな感じになるのでしょうか。 上手く説明できずに、また説明が不十分なところがあり恐縮ですが、アドバイスのほど頂戴出来れば幸いです、 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • EXCEL 縦横ある顧客名から、重複をなくす方法を教えて下さい。

    下記の様なデータがあるとします。     1月度 高橋 佐藤 山田 2月度 佐藤 佐藤 山田 3月度 山田 高橋 高橋 4月度 山田 佐藤 高橋 ↓ これを結果、 高橋 佐藤 山田 と、重複をなくして、抽出させたいのです。 縦だけならば、フィルタオプションで出来たのですが、縦にも横にもたくさんデータがあるので、 方法に困っています。 良い方法を教えて下さい。

  • SQLServerのGROUP BYについて

    SQLServerでGROUP BYを使用してデータをSELECTする場合について質問があります。 GROUP BYを行う項目に’△△1’と’1△’というデータが入っていた場合、   ※上記の△は半角スペースです。 ’△△1’と’1△’は同じグループとして、グルーピングされるのでしょうか。 Oracleにデータを移行して、GROUP BYをかけると上記のケースはデータ件数が異なります。 これはSQLServerの仕様なのでしょうか。(バージョンは2000です。) お手数ですが、ご教示願います。 

  • excel グループごとにデータの種類数を数えたい

    こんばんは。お世話になります。 Excelで、データの種類数をかぞえたいのですが、いくつかのグループがあり、そのグループごとのデータの種類数をカウントしたいと考えています。 (データは数字のみ、空白もありますが、空白はデータ数として採用しない) ~データ~   A         B    1 グループ     データ 2   a          10 3  a           5 4   a 5   b           4 6   b           4  7   b            8  b            9  c           ・ 10  c           ・ ・    ・           ・ ・   ・ ・   ・ ~集計(求めたい結果)~ グループ    データの種類数 a           2       b           1 c           ・   ・           ・  ・           ・ 単純にB列のデータ種類を数えるには、 {=SUMPRODUCT(IF(B2:B・・・<>"",1/COUNTIF(B2:B・・・,B2:B・・・),0))} でできるというところまでは分かったのですが、「グループ別に」というところでつまづいています。 なお、Excel2007です。 恐縮ですが、ご教示願います。

  • 配列データをキーワード検索

    こんばんは。お世話になっております。タイトルにあるように配列内にあるデータを、キーワード検索をしたいと考えておりますが、テキストフォームに入力したキーワードが反映できずにいるため、アドバイスを頂戴したく投函させていただきました。 $string=array( "1組 男 高木義男 明るい性格 ok", "2組 女 高島幸子 根暗な性格 ok", "3組 男 飯田彰浩 前向きな性格 no", "2組 男 木下敏明 努力家 ok", "3組 女 結城聡子 心配性な性格 no", "1組 女 佐藤恵子 明るい性格 ok", ); 以上のような配列があり(各データのスペースはタブ区切りです)、テキストフォームで入力したキーワードを 最後のokとなっているのを条件に、名前の欄と性格の欄から、OR検索(*)をしたいのですが、上手く検索させることが出来ません。 *テキストフォームにてスペースでキーワードを入力したとき、OR検索としたい。 お忙しい中恐縮ですが、ご指導いただけたら幸いです。宜しくお願い致します。 以下が実際に記述している現在のソースです。 (テキストフォームにて入力されたキーワードをGETで送信しています) $key = urldecode($_GET["key"]); $key = mb_convert_encoding($key, 'EUC-JP', 'auto'); $key = mb_ereg_replace(" ", " ", $key); $arr = explode(" ",$key); foreach($arr as $keyy){ $wherearr[] = "(strstr($site_data_array[2], $keyy) OR strstr($site_data_array[3], $keyy))" ; } $wherestr = "(".implode(" OR ",$wherearr).")"; if($key != ""){ for($i=0; $i<$count; $i++){ $site_data = $string[$i]; $site_data_array = explode(" ", $site_data); if($wherestr AND trim($site_data_array[4]) == "ok"){ $search_array[] = implode("\t", $site_data_array);//この配列データを表示 } } }

    • ベストアンサー
    • PHP
  • グループ関数でソート処理は発生しないのでしょうか?

    グループ関数でソート処理は発生しないのでしょうか? GROUP BY句でグルーピングした後にMIN関数やMAX関数などを使えばソート処理が走るような気がしますが、実行計画を確認したところソート処理が走らずに適切な値が取得できました。 データは300万件あり、インデックスは貼ってないです。 GROUP BYでソート処理は走らないものなのでしょうか?

  • 【エクセル】不必要なスペースのみの削除

    教えてください。 エクセルのファイルなのですが、名前で    A列 「山田 太朗  」 「佐藤  進  」 「柳  二郎  」 「斉藤 裕美子 」 などの後ろに「スペース」がある、データがあります…。 この後ろのスペースのみ削除したいのですがいい方法がありますでしょうか。 なぜこのようなデータになったかといいますと、オフコンのデータをエクセルに転送したのでこのような形になりました。(オフコンのことは良くわかりません) 文字の置換なんかで消そうとしても、苗字と名前の間のスペースも消えてしまうのでダメでした。 名前のデータが300件以上あるので、手動で消すと結構時間が掛かってしまうので式か、機能でなんとかしたいのですが良い方法があれば教えていただきたいです。 数式なら若干知識もありますので、数式でもいい方法がありましたら教えてください。よろしくお願いします。

  • アクセスで空白がグループ化されない

    過去に質問があるか検索をしたのですが、 なかなか、合致したものが、見つからず、 すみません。 質問させていただきます。 20,000件ほどのデータで、Nullも含むデータを アクセスクエリのグループ化をしたのですが、 空白がどうしても、2つに分かれてしまいます。 見たところ、何も入力されていず、 エクセルにエクスポートして、if文で同じか確認しても 同じという結果がでます。 データ自体は、エクセルからインポートしました。 初心者の質問ですみません。 よろしくお願いします。 ちなみに、20,000件のうち、空白は2,777件で、 クエリでカウントすると、13件と2764件で分かれます。 また、エクセルのフィルターを使って、空白の件数を出すと 2,777件になります。 よろしくお願い致します。

  • Accessでグループ化した結果フィールドをつなげるには?

    Accessでグループ化した結果フィールドをつなげるには? Access2003で 区分/コード A/123 A/456 A/789 B/234 B/567 というテーブルがあり、グループ化すると、区分Aのコードは123、456、789、 区分Bのコードは234、567と表示や印刷することはできます。 (たとえば、フォームやレポートのサブフォームなどに各コードを表示することはできます) これを、 フィールド1/フィールド2 A/123456789 B/234567 というふうにコード部分を1つのフィールドにつなげることは可能でしょうか? 上記のように、区分Aのデータ件数は3件、区分Bは2件というように コードのデータ件数はまちまちですが、それに対応してつなげたいと考えております。 よろしくお願いいたします。