人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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',
),
),
),
);

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

●質問者: Otaxa
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:AAA CCC DDD FFF GGG
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● tdoi
●70ポイント

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

質問文の配列にはルートノードとなるものがなかったので、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;
}

参考になれば。

◎質問者からの返答

ありがとうございます!

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

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

大変助かりました。


2 ● kn1967
●0ポイント

(案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)のほうが良いとは思う。

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ