循环遍历数组并插入具有父子关系的表

时间:2010-06-23 09:21:25

标签: php mysql

我有一个看起来像

的数组
     Array
     (
     [438044691:maincategoryone] => Array
     (
      [0] => Array
       (
        [id] => 438044692
        [name] => main category one item one
                    [category] => Array
                    (
                        [2] => Array
                        (
                           [id] => 4380444456
                           [name] => main category one item one - sub
                        )

                    )
       )

      [1] => Array
       (
        [id] => 438044693
        [name] => main category one item two
       )
     )

     [438044701:maincategorytwo] => Array
     (
      [0] => Array
       (
        [id] => 438044702
        [name] => main category two item one
       )

     )

     [438044709:maincategorythree] => Array
     (
      [0] => Array
       (
        [id] => 438044710
        [name] => main category three item one
       )

      [1] => Array
       (
        [id] => 438044711
        [name] => main category three item two
       )

     )
 )

我如何在PHP中循环遍历这个并将数据存储在同一个表(MYSQL)中的父子孙关系中。

此外,插入数据后按顺序(父子孙子)检索数据的示例查询也很棒。

希望我的问题有道理。如果没有请原谅我,但我能告诉你更多信息。

非常感谢。

2 个答案:

答案 0 :(得分:0)

我建议在mySQL表中使用父类的引用键,如下所示:

CREATE TABLE categories (id INTEGER, name VARCHAR(32), parent INTEGER)

然后在你的PHP代码中,你有一个树模型,你读取id索引数组中的所有项目,然后将它组装成一个树。

$q = mysql_query("SELECT * FROM categories");
$n = mysql_num_rows($q);
$items = array();

while($item = mysql_fetch_assoc($q))
    $items[$item['id']] = $item;

foreach($items as $item)
    $items[$item['parent']]['category'] = $item;

print_r($items);

要从树中读取值,我将使用递归函数:

function add_to_tree($items, $tree_part, $parent) {
    $tree_part['parent'] = $parent;
    $items.push($tree_part);
    foreach($tree_part['categories'] as $child)
        add_to_tree($items, $child, $tree_part['id']);
}

然后你只需创建一个空数组,填充它并按顺序读取值。

$items = array();
add_to_tree($items, $tree);
foreach($items as $item)
    mysql_query("INSERT INTO categories VALUES('{$item['id']}', '{$item['name']}', '{$item['parent']}');

当然,您必须处理特殊情况,例如根对象和缺少的链接,这在以前的代码中不受支持。

答案 1 :(得分:0)

您可以通过创建包含3列idnameparentid

的表来执行此操作

您可以使用PHP array_walk函数遍历数组并随意插入行(或构建一个sql查询以便稍后执行):

    $myArray = ......
    array_walk($myArray , 'insertInDb', null);

    function insertInDb($item, $key, $parent_id) {
        if (is_null($parent_id)) {
            $sql = sprintf('INSERT INTO myTable (`id`, `name`, `parentid`) VALUES (%d, "%s", NULL)', $item['id'], $item['name']);
        } else {
           $sql = sprintf('INSERT INTO myTable (`id`, `name`, `parentid`) VALUES (%d, "%s", %d)', $item['id'], $item['name'], $parent_id);
        }
        array_walk($item['category'] , 'insertInDb', $item['id']);
    }