iT邦幫忙

0

將樹狀結構圖資料轉為子母關係存入資料庫

  • 分享至 

  • xImage

我有一個多為陣列如下,如何將下列資料用子母關係存入資料庫,並轉化為id,name,paren欄位存入。

Ex
table:
id, name, parent, depth
1 , a , 0 , 1
2 , b , 1 , 2
3 , c , 1 , 2
4 , d , 1 , 2
5 , e , 0 , 1
6 , f , 5 , 2
7 , g , 6 , 3
8 , h , 6 , 3

$ary = [
    "a" => [
        "b",
        "c",
        "d",
    ],
    "e" => [
        "f" => [
            "g",
            "h",
            "i",
        ],
        "j" => [
            "k",
            "l",
            "m",
        ],
        "n" => [
            "o",
            "p",
            "q",
        ],
    ],
    "r" => [
        "s" => [
            "t",
            "u",
            "v",
            "w",
            "x",
            "y",
        ],
        "z" => [
            "aa",
            "bb",
            "cc",
            "dd",
            "ee",
            "ff",
        ],
        "gg" => [
            "hh",
            "ii",
            "jj",
            "kk",
            "ll",
            "mm",
        ],
    ],
    "nn" => [
        "oo",
        "pp",
        "qq",
        "rr",
        "ss",
        "tt",
    ],
    "uu" => [
        "vv",
        "ww",
        "xx",
        "yy",
        "zz",
    ],
];
froce iT邦大師 1 級 ‧ 2022-04-30 23:03:53 檢舉
Self Referencing Foreign Key
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
淺水員
iT邦大師 6 級 ‧ 2022-04-30 23:33:14
最佳解答
$result = [];
$iteratorStack = [(new ArrayObject($ary))->getIterator()];
$parentIdStack = [0];
$idx = 0;
$idCount = 1;
while ($idx >= 0) {
    $it = $iteratorStack[$idx];
    $parentId = $parentIdStack[$idx];
    if (!$it->valid()) {
        unset($iteratorStack[$idx]);
        unset($parentIdStack[$idx]);
        --$idx;
        continue;
    }
    $key = $it->key();
    $val = $it->current();
    if (gettype($key) === 'integer') {
        $key = $val;
        $val = false;
    }
    $myId =  $idCount++;
    $result[] = [
        'id' => $myId,
        'name' => $key,
        'parent' => $parentId,
        'depth' => $idx + 1
    ];
    if (gettype($val) === 'array') {
        ++$idx;
        $iteratorStack[$idx] = (new ArrayObject($val))->getIterator();
        $parentIdStack[$idx] = $myId;
    }
    $it->next();
}
foreach ($result as $row) {
    printf("%s, %s, %s, %s\n", $row['id'], $row['name'], $row['parent'], $row['depth']);
}
0
I code so I am
iT邦高手 1 級 ‧ 2022-05-01 09:36:36

多數資料庫(MS SQL、PostgreSQL...)均支援JSON,直接存入整個資料結構,也可以使用NoSQL資料庫,好處是不需拆成多個資料表,要查詢時又要join多個資料表。
可參閱:

  1. MS SQL:https://docs.microsoft.com/zh-tw/sql/relational-databases/json/json-data-sql-server?view=sql-server-ver15 。
  2. PostgreSQL:https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-json/ 。

我要發表回答

立即登入回答