0

我有一个嵌套的拖放列表,它返回 json 格式字符串。我可以在这个字符串上运行 php serialize、json_decode 等。但我坚持将层次结构保存在数据库中。

返回输出示例:

[{"id":1,"children":[{"id":2,"children":[{"id":4},{"id":7},{"id":8}]} ,{"id":3}]},{"id":5},{"id":6}]

...或者...

大批
(
    [0] => 数组
        (
            [id] => 1
            [孩子] => 数组
                (
                    [0] => 数组
                        (
                            [id] => 2
                            [孩子] => 数组
                                (
                                    [0] => 数组
                                        (
                                            [id] => 4
                                        )

                                    [1] => 数组
                                        (
                                            [id] => 7
                                        )

                                    [2] => 数组
                                        (
                                            [id] => 8
                                        )

                                )

                        )

                    [1] => 数组
                        (
                            [id] => 3
                        )

                )

        )

    [1] => 数组
        (
            [id] => 5
        )

    [2] => 数组
        (
            [id] => 6
        )

)

我想将此输出保存到这样的数据库结构中:

如果不存在 `menu` 则创建表 (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `rang` int(11) NOT NULL,
  `parent_id` int(11) NOT NULL,
  `name` varchar(256) NOT NULL,
  `description` varchar(256) NOT NULL,
  主键(`id`)
) 引擎=InnoDB 默认字符集=latin1 AUTO_INCREMENT=9 ;

有任何想法吗?

4

3 回答 3

1

我会这样做:

<?php
$jsonString = '[{"id":1,"children":[{"id":2,"children":[{"id":4},{"id":7},{"id":8}]},{"id":3}]},{"id":5},{"id":6}]';
$jsonArray = json_decode($jsonString, true);

function parseJsonArray($jsonArray, $parentID = 0)
{
  $return = array();
  foreach ($jsonArray as $subArray) {
     $returnSubSubArray = array();
     if (isset($subArray['children'])) {
       $returnSubSubArray = parseJsonArray($subArray['children'], $subArray['id']);
     }
     $return[] = array('id' => $subArray['id'], 'parentID' => $parentID);
     $return = array_merge($return, $returnSubSubArray);
  }

  return $return;
}

var_dump(parseJsonArray($jsonArray));

你应该得到这样的数组:

Array ( 
  [0] => Array (
    [id] => 1 
    [parentID] => 0 
  ) 
  [1] => Array (
    [id] => 2
    [parentID] => 1 
  ) 
  // ETC.
) 
于 2012-07-06T08:04:47.767 回答
0

我假设,您使用 JSON-Data 中的 ID 作为数据库中的主键。所以你不必处理 LAST_INSERT_ID。

function storeTree(array $treeList) {
    // Optional: Start DB-Transaction
    try {
        storeList($treeList);
        // Optional: Commit DB-Transaction
    } catch(Exception $e) {
        // Optional: Rollback DB-Transaction
    }

}

function storeList(array $list, $parentId=null) {
    foreach($list as $child) {
        storeChild($child, $parentId);
    }
}

function storeChild(array $childData, $parentId=null) {
    $childId = $childData['id'];
    $children = isset($childData['children']) ? (array) $childData['children'] : array();

    // Add a new dataset: `id` = $childId, `parent_id` = $parentId

    storeList($children, $childId);
}

storeTree($youJsonData);

此代码未经测试,可能包含错误...

于 2012-07-06T08:01:26.197 回答
0

Eigher 你在 mysql German Tutorial for Nested Sets上设置了一个嵌套集模型,什么可能是最好的方法,或者你可以将请求字符串存储在你的数据库中(但要注意,你不能在 mysql 端执行任何操作......)

于 2012-07-06T07:53:08.803 回答