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

Php 循环遍历数组并插入到具有父子关系的表中,php,mysql,Php,Mysql,我有一个数组,看起来像 Array ( [438044691:maincategoryone] => Array ( [0] => Array ( [id] => 438044692 [name] => main category one item one [category] => Array

我有一个数组,看起来像

     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)中的父子孙关系中

另外,一个示例查询可以在插入后按顺序检索数据(父子孙)

希望我的问题有意义。如果没有,请原谅,但我可以给你更多的信息


非常感谢。

我建议在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']}');

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

您可以通过创建一个包含3列的表来完成此操作
id
name
parentid

您可以使用PHP函数遍历数组并在执行过程中插入行(或构建sql查询以便稍后执行):


你有无限的深度,还是在孙子处停止(我的意思是孙子是叶子)?最大深度是3,这是主子子子。我不认为它会更深入。嘿,谢谢你的回答,这可以用来检索数据,但首先我必须能够使用所示数组中的父子-孙子关系将数据插入表中。是的。嗨,那么,将_添加到_树中传递的$parent参数是什么?还有这个函数,它会返回$tree\u部分吗?。哦,我认为$items.push在PHP中不起作用,所以我认为这是array_push?。我只是从我的头脑中编写了代码,所以有一些问题。
add_to_tree
行应该是
add_to_tree($items,$tree,0)是的,它是array_push:)我在javascript语法上犯了一个错误。add_to_tree函数(不是一个很好的名称,应该是add_from_tree)递归读取树并将项添加到$items数组中,因此不需要返回值。
    $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']);
    }