PHPとMySQLで入れ子集合モデルを作成しようと思っています。

http://www.geocities.jp/mickindex/database/db_tree_ns.html
PHPにて、例えば以下のような多次元配列があった場合、
入れ子集合モデルの添字をつけた上でMySQLのテーブルに保存するにはどのようにすればよろしいでしょうか。

$arr=array(
  array(
    'id'=>'aaa',
    'child'=>array(
      array(
        'id'=>'bbb'
      ),
      array(
        'id'=>'ccc'
      ),
    ),
  ),
  array(
    'id'=>'ddd',
    'child'=>array(
      array(
        'id'=>'eee',
        'child'=>array(
          array(
            'id'=>'fff'
          ),
        ),
      ),
      array(
        'id'=>'ggg',
      ),
    ),
  ),
);

配列の深さは一定ではありません。
できれば具体的なソースを提示願えますでしょうか。
よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2009/12/07 13:17:00
  • 終了:2009/12/07 16:21:21

回答(2件)

id:tdoi No.1

tdoi回答回数174ベストアンサー獲得回数752009/12/07 14:01:19

ポイント70pt

こんな感じで再帰的にやればよいかと。

質問文の配列にはルートノードとなるものがなかったので、rootというidのものを追加しています。

$arr = array('id' => 'root',
	     'child' => array(array('id'=>'aaa',
				    'child'=>array(array('id'=>'bbb'),
						   array('id'=>'ccc'))),
			      array('id'=>'ddd',
				    'child'=>array(array('id'=>'eee',
							 'child'=>array(array('id'=>'fff'))),
						   array('id'=>'ggg')))));


$id       = $arr['id'];
$children = isset($arr['child']) ? $arr['child'] : array();

insert_data($id, $children);

function insert_data($id, $children, $left = 1)
{
  $leftIndex = $left;
  foreach ($children as $child) {
    $childId       = $child['id'];
    $grandChildren = isset($child['child']) ? $child['child'] : array();
    $leftIndex = insert_data($childId, $grandChildren, $leftIndex + 1);
  }

  $rightIndex = $leftIndex + 1;
  $query = "INSERT INTO tbl_name (id, lft, rgt) VALUES ('{$id}', {$left}, {$rightIndex})";
  echo $query . "\r\n";

  return $rightIndex;
}

参考になれば。

id:otaxa

ありがとうございます!

ルートの存在を忘れてました・・・すみません。

ご提示いただいたコードを参考にバッチリいけそうです。

大変助かりました。

2009/12/07 16:18:42
id:kn1967 No.2

kn1967回答回数2915ベストアンサー獲得回数3012009/12/07 14:07:14

(案1)シリアライズ

$arr をシリアライズしてから、MySQLに保存。

http://jp2.php.net/manual/ja/function.serialize.php

MySQLから取り出した後は、アンシリアライズをして元に戻す。

http://php.net/manual/ja/function.unserialize.php


(案2)XML

XMLに整形してから保存、以後XMLとして取り扱い。

http://dev.mysql.com/doc/refman/5.1/ja/xml-functions.html


(2)は将来性はありますが、まだまだ変更される可能性の高いものですし、

取り扱い易さ、応答速度など(1)のほうが良いとは思う。

id:otaxa

すみませんが「入れ子集合モデルで」MySQLに入れたいんです・・・

2009/12/07 16:19:54

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません