簡體   English   中英

如何使用遞歸將數據保存到數據庫

[英]How save data to database using recursion

我的mysql表如下所示:

page_id     parnt_id    page_name
------------------------------------
1           0           AboutUs
2           1           Contact_us
3           2           Home
4           2           Currear

我有一個看起來像這樣的數組:

Array
(
    [0] => Array
        (
            [id] => 1
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [id] => 3
                                        )

                                )
                        )
                )
        )
)

如何使用遞歸將上述數組添加到數據庫中?

$all_pages = $given_array;

function save_page($page, $parent_id = 0) {

  $page_id = $page['id'];
  $sql = "INSERT INTO table_name (page_id, parent_id)
         VALUES ($page_id, $parent_id)";
  mysql_query($sql);

  if(array_key_exists('children', $page)) {
    save_page($page['children'], $page['id']);
  }
}

save_page($all_pages);

您可以使用一些幫助程序類來代替自己進行遞歸。 假設以下數據:

$data = [[
        'id' => 1,
        'name' => 'About_Us',
        'children' => [[
                'id' => 2,
                'name' => 'Contact_Us',
                'children' => [[
                        'id' => 3,
                        'name' => 'Home',
                ], [
                        'id' => 4,
                        'name' => 'Careers',
                ]],
        ]],
]];

您可以使用RecursiveArrayIterator為您執行迭代,以便可以在一個簡單的循環中執行數據庫工作:

$stmt = $db->prepare('INSERT INTO pages (page_id, parent_id, page_name) 
    VALUES (?, ?, ?)');

$it = new RecursiveIteratorIterator(
    new RecursiveArrayIterator($data), 
    RecursiveIteratorIterator::CHILD_FIRST
);

foreach ($it as $key => $node) {
    if (!isset($node['id'])) {
        continue; // skip nodes without an id field
    }

    if ($it->getDepth() > 1) {
        // go two levels down for the parent
        $parent = $it->getSubIterator($it->getDepth() - 2)->current();
    } else {
        $parent = null;
    }

    $stmt->execute([$node['id'], $parent ? $parent['id'] : 0, $node['name']]);
}

如下所示:

function importPages($pages, $parent_id = 0) {
  foreach ($pages as $page) {
    insertToDB($page['id'], $parent_id);
    foreach ($page['children'] as $child) {
      importPages($child, $page['id']);
    }
  }
}
function recurInsert($node, $parent) {
    $que = "INSERT INTO `table_name` (page_id, parnt_id) VALUES ('".$node['id']."', '".$parent."')";
    // process this query, you can add page name also, 
    // but I don't know where you store it
    if (is_array($node['children'])) {
        foreach ($children as $child) {
            recurInsert($child, $node['id']);
        }
    }
}
// start recursion 
recurInsert($your_array, 0);

哦,我剛剛注意到@xdazz,來自印度的家伙已​​經回答了幾乎相同的問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM