• 締切済み

Perlでツリー構造を生成

Tacosanの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

最後の「端数」をどう処理するかによりますが, ヒープに類似の方法が使えるかもしれません. つまり, 配列 @ID に店舗ID があるとして $ID[0] を最上位の店舗とします. あとは ・店舗$ID[i] の子店舗は $ID[i*N+1]~$ID[i*N+N] という形で親子関係を割り当てていきます. 逆にいうと ・店舗$ID[i] の親店舗は $ID[(i-1)/N] です. 最初に書いたように「端数」の処理が分からないのですが, これでいいなら「配列をランダムな順番にシャッフルするだけ」で処理が終わります.

hobiko
質問者

お礼

ありがとうございます! うまくやればシンプルにまとめられそうですね この路線でも考えてみたいと思います 端数については左詰め?というか、店舗がすべて家族関係に含まれた時点で終了という感じで考えています

hobiko
質問者

補足

すみません、補足です ちなみにこの方法だと世代数がわからないと 結局どの一つ一つのIDに対して親を指定できないような気もするのですが、正しいでしょうか?

関連するQ&A

  • PHPとjQueryでツリー

    はじめまして。プログラムを独学で学んでいる者です。 今回初めて開発をしてみたのですが、どうしてもうまくいかないため こちらに投稿した次第です。 やりたいことは以下の通りです。 PHPとJQueryツリー構造 (完成図) 親 ■ツリー(1)  |  ■親データ(2)  | |  |  ∟■子データ(3)  |    |  |     ∟■孫データ(4)  |       |  |        ∟■孫2データ(5)  |  ■親データ  | |  |  ∟■子1データ  |  ■親データ  | |  |  ∟■子1データ  | |  |  | |   ∟■孫1データ  | |  |  ∟■子2データ  |  ■親データ  | |  |  ∟■子1データ  |    |  |     ∟■孫1データ  |       |  |        ∟■孫2データ  |  ■親データ 表示部分で親データの表示をだしつつ、子データのSQLをとばして子データの表示をだしつつ、孫データのSQLをとばす。 これを繰り返したい。 (1)まず親データのSQLをとばす。 (2)親データを一件取得したら、表示する。その親SQLで得られた結果をもとに子SQLをとばす。 (3)子データがあれば表示。(なければ2件目の親データを取得。) 子SQLで得られた結果をもとに、さらに子SQLを飛ばす。 (4)そこに結果があれば孫データとして表示。(なければ2件目の親データを取得) 得られた結果をもとに子SQLを飛ばす。 (5)結果があれば次の孫データとして表示。 結果が存在しなければ、親データに戻り・・・・繰り返し上記のように処理する。 自分で試行錯誤し、phpとjQueryでなんとか上図のように親--子--孫と出せるようになりました。 しかし、1件ごとに子・孫データが無いかSQLを飛ばして調べるので、非常に時間がかかります。 データが30件ほどあると表示するのに10分はかかります。 処理しきれずに途中で終わってしますこともシバシバ・・・・。 他の方法として考えたのが、親データがクリックされたら子SQLを飛ばして展開部分を表示するという方法です。 しかしクリックしたらメソッドを呼び出すという、phpの処理を分割することはできないとネットに乗っていました。 (私の調べ方に問題があったのかもしれませんが・・・) <ul> <li id=id>親データ   <ul>     <li id=id2>子データ      <ul>      <li id=id3>孫データ      </ul>  </ul> <li id=id>親データ2 ・ ・ ・ ↑のような構造で「<li id=id>親データ」がクリックされたときに、phpの子SQLをなげる仕組みなどは 可能なのでしょうか? それとも地道にSQLを投げて1件ずつ確認する方法しかないのでしょうか? プロの方の意見等、知恵をお借りしたいです。 ご教授よろしくお願い致します。

    • 締切済み
    • PHP
  • PHPでツリー表記したい

    phpで掲示板を作ろうとしていまして、DBから取ったデータを木構造にしてツリー表示させたいです。 親のparent_idはnull, 子は親のidになります。 自己結合させてみたり、再帰処理を試そうとしているのですが自分のphpスキルが未熟で巧い実装ができません。表示方法を教えていただければと思います。 ↓理想です 親レコード1 └子レコード5 └子レコード4 └子レコード3 └子レコード2 └子レコード1

    • 締切済み
    • PHP
  • Perlのforkについて

    PerlでDBに格納するプログラムを作成しています。 パラレルで行ないたいためにforkを使っているのですが、 いまいちわかっていないのでご教授ください。 やりたいことはパラレルでのDB格納です。 親、子両方のプロセスが完了したら後続処理を行い、 0を戻したいのですが、下記の方法ですと、 子が終了したらprintしてからreturnしているようです。 このように、親子の処理が完了したら後続処理に移るようにするためには どうしたらよいのでしょうか? if ($pid = fork()) { #親プロセス insertDB(); wait; return 0; } else { insertDB(); } print"ここは最後に通したい"\n;

    • ベストアンサー
    • Perl
  • Select時に取得行番号を指定する方法って・・

    Select文の時、大量データを処理する場合(java)、レコードセットクラスのnextメソッドでレコードを取得していますが、取得レコードが大量になるとnextメソッド内でヒープサイズがオーバーし、例外が発生してしまいます。なのでトランザクションを複数回にわけて発行し、全件処理したいのですが、Select時に例えば1件~1000件目まで取得とか、1001件から2000件まで取得とかって可能でしょうか?ちなみにDBはDB2を使用しています。

  • DB検索について

    (1)PHPにてSQLをコールしてテーブルから情報の取得を行いたいのです。  $cmnd = "select * from table_a where id=01";を実行し(fetch使用)  仮に15件セレクトされたとすると、抽出された15件は  プログラム内のどこに格納されるのですか? (2)また、そのレコードを順じ処理する場合において、終了条件はどの様に  判定したら良いでしょうか?  DB:oracle

    • 締切済み
    • PHP
  • HTML(AJAX)-perl -DB(MySQL)-perl -HTML(AJAX)のデータの流れについて。

    こんにちわ。 早速ですがよろしくお願いします。 タイトルの通り、画面入力のデータAをperlに投げてAを元にperl側でDBデータ取得(A')、A'を元の入力画面で処理結果として出力する事を考えています。 HTML(AJAX)-perl -DB(MySQL)-perl ↑ここまではできたのですが、最後の perl -HTML(AJAX) が出来ず、A'を入力画面に返す方法が分かりません。 ちなみに処理結果(A')をHTML側でYahoo! User Interfaceを使用してテーブル処理する予定です。 お恥ずかしながらプログラミングに関しての知識が乏しくて恐縮なのですが、どうぞよろしくお願い致します。

    • ベストアンサー
    • Perl
  • phpの二次元配列の値をランダムに取得したい

    ちょっとわからないことがありますので、質問させて頂きます。MYSQLから取得したデータ(二次元配列)から、ランダムに値を10件取得したいと思っております。 実際、DBにクエリを投げる段階で、 "select id,name,description from teble order by rand()" をしても、そのテーブルにあるデータ全体から取得という感じになってしまいます。 新しく追加されたデータ10件から、ランダムに取得できないので、新しく追加されたデータ10件をまずDBから取得して、php側でその中からランダムに値を取得するしかないのかと思っております。 shuffle();等を使用したのですが、配列のキーをランダムに取得するような形で、その中身を一緒に取得することができません。 考えても私の知識では解決できませんので、お分かりになる方、ご教授くださいますようお願いいたします。

    • 締切済み
    • PHP
  • find_or_createのようなクエリを出したい

    お疲れ様です。 お世話になります。 データベースにあるキーを基にSELECTを出して、該当レコードがあればそのレコードのIDを取得、 なければ、そのキーをINSERTして、INSERT_IDを取得する。 これをひとつのクエリでできないかと悩んでいます。 perlだとfind_or_createというメソッドがあるらしいのですが、 私はPHP書きです。 DBはMySQL5を使っています。 PHPも5xです。 ググってもあまりいい案はなく、ムリならムリと突きつけていただければ 2つのクエリでがんばります。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • Perlでのセッション管理と不要セッション削除について

    いつもお世話になっています。 Perlにてセッション管理(ログインして、サイト内はユーザーIDなどを持ちまわるような)を行おうとしています。 CGI::Sessionを使用して実現できると思っているのですが、 疑問があります。 セッション情報の持ち方は、サーバー内にファイルか、DBに格納する ことになると思いますが、不要になったファイルやレコードは、 みなさんどうされているのでしょうか? (ログアウトボタンがあっても、ブラウザの閉じるボタンを押される ケースが多いと思いますので、必ずdelete()はできないですよね?) 削除バッチなどで定期的に削除することを考えていますが、 もっとスマートなやり方があればご教示いただければと思います。 よろしくおねがいします。

  • 大量データの取得処理について

    テーブル1のレコードを全件取得し、取得したレコードの特定の項目を一件ずつチェックし、テーブル2の値を更新する処理を考えています。 しかし、テーブル1のレコード数が8万件存在するため、一気に全件を取得するのはまずいことになるのではと危惧しています。 そこで、fetch first ~ rows を使用するため、テーブル1に項目を追加し、更新が済んだらその項目にフラグを立てるような処理も考えましたが、 たった一度の処理のためにテーブルに項目を追加するのもどうかなと思っています。 1000件くらいずつ順番に取得できる良い方法があったら教えてください。 よろしくお願い致します。 ちなみにデータベースはDB2を使用しています。