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',
),
),
),
);
配列の深さは一定ではありません。
できれば具体的なソースを提示願えますでしょうか。
よろしくお願いします。
こんな感じで再帰的にやればよいかと。
質問文の配列にはルートノードとなるものがなかったので、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; }
参考になれば。
(案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に入れたいんです・・・
ありがとうございます!
ルートの存在を忘れてました・・・すみません。
ご提示いただいたコードを参考にバッチリいけそうです。
大変助かりました。