• ベストアンサー

◆配列

いつもお世話になっています。 [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 ループで色々探っているのですが。。。 宜しくお願いします。

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

  • ベストアンサー
  • 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件以上にもなりえます。 丸投げで恐縮ですが、サンプルソースを頂けないでしょうか。

専門家に質問してみよう