• ベストアンサー

◆配列

いつもお世話になっています。 [0] => ttp://aaa.hoge.jp/1.html [1] => ttp://bbb.hoge.jp/1.html [2] => ttp://ccc.hoge.jp/1.html [3] => ttp://ddd.hoge.jp/1.html [4] => ttp://aaa.hoge.jp/2.html [5] => ttp://aaa.hoge.jp/3.html [6] => ttp://aaa.hoge.jp/4.html [7] => ttp://bbb.hoge.jp/2.html [8] => ttp://bbb.hoge.jp/3.html [9] => ttp://bbb.hoge.jp/4.html [10]=> ttp://bbb.hoge.jp/5.html 上記の配列があります。例えば同じURLの場合3件まで取得しもう一つ配列を作成したい。 上記の配列だと下のような配列にしたい。 [0] => ttp://aaa.hoge.jp/1.html [1] => ttp://bbb.hoge.jp/1.html [2] => ttp://ccc.hoge.jp/1.html [3] => ttp://ddd.hoge.jp/1.html [4] => ttp://aaa.hoge.jp/2.html [5] => ttp://aaa.hoge.jp/3.html [6] => ttp://bbb.hoge.jp/2.html [7] => ttp://bbb.hoge.jp/3.html ループで色々探っているのですが。。。 宜しくお願いします。

  • PHP
  • 回答数3
  • ありがとう数0

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

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.2

「URLの配列から、同じホストのURLを3件までに制限した配列を抽出したい」という事でよろしいでしょうか? ループ中で、preg_match などでホスト名を取得し、各ホストの出現回数を連想配列に保持すればよいかと。 例) ------------------------------------------------------------------------ $url_list = array( "ttp://aaa.hoge.jp/1.html", "ttp://bbb.hoge.jp/1.html", "ttp://ccc.hoge.jp/1.html", "ttp://ddd.hoge.jp/1.html", "ttp://aaa.hoge.jp/2.html", "ttp://aaa.hoge.jp/3.html", "ttp://aaa.hoge.jp/4.html", "ttp://bbb.hoge.jp/2.html", "ttp://bbb.hoge.jp/3.html", "ttp://bbb.hoge.jp/4.html", "ttp://bbb.hoge.jp/5.html" ); $result = array(); $host_count = array(); foreach ($url_list as $url) { preg_match('|^ttp://([^/]+)/.*|', $url , $matches); if (!array_key_exists($matches[1], $host_count) || $host_count[$matches[1]] < 3) { array_push($result, $url); $host_count[$matches[1]]++; } } print_r($result); ---------------------------------------------------------------------------- (「ttp」は「http」に置換えて読んで下さい。) phpの警告が出るかも知れませんが、 array_key_exists 関数などを使って適宜対応して下さい。

その他の回答 (2)

noname#87667
noname#87667
回答No.3

すみません。もうSEは引退してしまったので、サンプルソースを作る余裕がございません。 ただ、1000件以上のドメインとなると、配列では処理しきれないと思いますので、DBの利用をお勧めします。DBであれば、一瞬で解決しそうな気がします。 ・ドメインAとそれ以降の文字列Bを分離する。←No.2さんのpreg_matchを利用 ・insert into hoge_tbl(domain,file) values({$A},{$B}); ・select domain,file from hoge_tbl where domain={$A} order by file limit 3;←このSQL文で取得したデータを配列に入れる。 # 変数のところは、ヒアドキュメントに従い{}で囲いました。

noname#87667
noname#87667
回答No.1

どれくらいのドメイン数なのかわかりませんが、ストレートに考えるとこうなるのではないでしょうか? ・元の配列から1つずつ値を取得する。 ・ドメインをキー、それ以降の文字列を値とする配列Xを新規に作り、ドメインとそれ以降の文字列の2つを格納する。 ・配列Xから同じキーのデータを抽出し、キープしたい3件分のデータ以外を削除。 ・加工が終わった配列Xからキーと値を両方抽出し、配列を作り直す。 思いつきで書いたので、はずしていたらごめんなさい。

gogovamos
質問者

補足

ドメイン数は1000件以上にもなりえます。 丸投げで恐縮ですが、サンプルソースを頂けないでしょうか。

関連するQ&A

  • ◆wgetのオプション

    いつもお世話になっています。 wgetでサブドメインが異なるサイトを1回のコマンドで取得できますか? ttp://AAA.hoge.jp/ ttp://BBB.hoge.jp/ ttp://CCC.hoge.jp/ 現在は上記のように1つ1つ把握し、回数分wgetをループさせているのですが、ttp://hoge.jp/というドメインが分かっていれば、1コマンドで全てのサブドメインを含め取得できないのでしょうか? 宜しくお願いします。

  • 配列の移動

    TEXTファイルに文字列を書き込んだり削除したり移動したりするプログラムを作成していますが、 aaa bbb ccc ddd eee fff ggg hhh iii このような内容を 1,aaa bbb ccc 2,ddd eee fff 3,ggg hhh iii のように上から順番に配列化して番号を指定して移動させたいのですが、 3の配列を2の上(配列1と配列2の間)や下(配列2と配列3の間)に移動するのにはどのようにしたら良いのでしょうか?

    • ベストアンサー
    • Perl
  • CSVファイルをAccessに取りこみたい

    以下のような2つのCSVファイルがあるとします。 【hoge1.csv】 aaa,bbb,ccc,ddd 1,2,3,4 【hoge2.csv】 aaa,bbb,ddd,eee,fff 1,2,4,5,6 Accessをあまり使用したことがないので教えていただきたいのですが、 hoge1.csv、hoge2.csvを、以下のような形で Accessの1つのテーブルにインポートする事はできるのでしょうか? ---------------------------- | aaa | bbb | ccc | ddd | eee | fff | | 1 | 2 | 3 | 4 |  |  | | 1 | 2 |  | 4 | 5 | 6 | ---------------------------- ※「aaa」「bbb」…をフィールド名としたいです vb等でプログラムを自作するしかないのでしょうか? 何か良い方法がありましたら教えてください。お願いします。

  • 大量データの一括変換

    aaa.bbb ccc.ddd eee.fff ggg.hhh 上記のようなデータが約1万行程度あるのですが、これを下記のようなユーザ名・メルアドに変換するコマンド等、お分かりになる方教えてください。ユーザ名・メルアドの間は半角スペースです。 ある程度自分で調べた結果awk等で出来そうな気がするのですが。。。 ユーザ名  メルアド   ↓     ↓ aaa.bbb aaa.bbb@hoge.com ccc.ddd ccc.ddd@hoge.com eee.fff eee.fff@hoge.com ggg.hhh ggg.hhh@hoge.com

  • バッチファイルで「,]区切りの文字を抜き出したい

    現在、バッチを作成しているのですが、txtファイルからの文字の抜き出しがうまくいきません。 findstr /b "aaa" C:\tmp\test.txt 上記で行毎では抜き出せるのですが、それから[ , ]区切り毎の抜き出し方がわかりません。 [test.txt] aaa,bbb,ccc,ddd eee,ffffff,ggggg,hhhh 下記のようにそれぞれ変数に代入したいと考えております。 aaaで実行する場合。 hoge1=aaa hoge2=bbb hoge3=ccc hoge4=ddd eeeで実行する場合。 hoge1=eee hoge2=fffff hoge3=ggggg hoge4=hhhh 変数への代入はfor文を使用しようと考えております。 お知恵をよろしくお願いいたします。

  • 2つの配列を比較し、一致しないのを得たいのですが

    連想配列 $foo = array( "aaa" => "111", "bbb" => "222", "ccc" => "333" ); と 一般配列 $bar = array( 0 => "aaa", 1 => "bbb" ); がある場合に、$iを数字として、 $fooのkey部と$bar[$i]の値が一致したら(つまり、例えばaaa)、 $fooの中のその部分は除去するような事がやりたいのですがどのようにすればいいのでしょうか? 色々試してみましたが、自分には全く出来ませんでした。 除去ではなく、新しい配列に $hoge = array( "ccc" => "333" ) のような形で入れ込むのでもいいのですが、とくかく$hogeのような配列を手に入れたいと考えております。 アドバイス頂けないでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • Listのマッチを判定する便利Util

    Javaで以下のような処理をスマートに実現する良い方法を教えて下さい。 ・Listに配列をaddして、そのListの配列に対して指定した値がいくつマッチするかを判定する。 具体例として、 1、配列を作成 String[] array1 = { "aaa", "bbb", "ccc" }; String[] array2 = { "bbb", "ccc", "ddd" }; String[] array3 = { "ccc", "ccc", "ddd" }; String[] array4 = { "fff", "ggg", "hhh" }; 2、Listに配列を格納 List list = new ArrayList(); list.add(array1); list.add(array2); list.add(array3); list.add(array4); 3、Listの要素から"ccc"と"ddd"が2つマッチする要素を取得 上記の場合は"ccc"と"ddd"が2つマッチするのはarray2だけなのでarray2を取得する。 ※array3も"ccc"と"ddd"が2つありますが、"ccc"が2つあるので計3つマッチと判定して取得しない。 質問は上記3、の箇所です。 できればfor文でループさせて突合せ処理みたいなことは避けてスマートに実現する方法を探しております。 どなたか良い方法をご存知でしたらご教示下さい、お願い致します。

    • ベストアンサー
    • Java
  • 配列をさらに小分けしたい。

    以下のような配列があるとします。    No  data ------------------ (0) No1 AAA (1) No1 BBB (2) No1 CCC (3) No2 DDD (4) No2 EEE (5) No3 FFF (6) No3 GGG Noごとに処理をさせたいので、処理しやすいようにNoごとに配列を作りたいのですが、どうしていいかわかりません。 よい方法はありませんでしょうか??

  • ArrayListに多次元配列

    ArrayListに多次元配列の変数を格納したのですが、取り出し方がわからず困っています。 ----------------------------------------------- String[][] str = {{"aaa","bbb","ccc","ddd","eee","fff"}, {"aaa","bbb","ccc","ddd","eee","fff"}, }}; ArrayList array = new ArrayList(); array.add(str[0]); array.add(str[1]); ----------------------------------------------- 上記の場合で、str[0][2];を取得する方法がわかりません。 java初心者なのでおかしな質問かもしれませんが、宜しくお願いします。

    • ベストアンサー
    • Java
  • SQL文 テーブル1つに複数のデータ

    お世話になっております。 SQLでの質問です。 --テーブル---------- F_1 F_2 AAA BBB AAA CCC BBB XXX CCC DDD DDD YYY 1.F_1のAAAを条件にF_2のBBB・CCCを取得し、 F_1のBBB・CCCと、F_2のXXXとDDDを取得します。 2.次に、取得したF_2のXXX・DDDを条件に、F_1のDDD、F_2のYYYを取得します。 これを1つのSQLで実行したいのですが、副問合せを駆使しても、良いSQLが思い浮かびません。 有識者の方、ご享受頂きたいです。 宜しくお願い致します。

専門家に質問してみよう