2010-06-23 79 views
0

我有一个数组,它看起来像循环通过数组,并插入到表父子关系

 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)。

另外一个插入数据的示例查询(parent-child-grandchild)会很好。

希望我的问题有道理。如果不是,请原谅我,但我可以给你更多的信息。

非常感谢。

+0

你有无限的深度还是停在孙子(我的意思是孙子们是叶子)? – greg0ire 2010-06-23 09:29:29

+0

那么最大深度将是3,即主子subub。我不认为它会更深入。 – bharath 2010-06-23 09:40:25

回答

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']); 
} 

然后你只需要创建一个空数组,填充它,并sequencially读出值。

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

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

+0

嘿谢谢你的回答,这可以工作来检索数据,但首先,我必须能够将数据插入到表中与父 - 子 - 大的孩子关系从数组显示是啊。 – bharath 2010-06-23 09:42:25

+0

是的,我刚刚意识到缺少的部分:)相应编辑。 – slaphappy 2010-06-23 09:43:43

+0

嗨那么$父参数传递给add_to_tree?也是函数,它会返回$ tree_part ?. 和哦,我认为$ items.push不会在PHP中工作,所以我想像是array_push ?. – bharath 2010-06-23 10:09:38

0

你可以通过创建一个具有3列idname表做到这一点,parentid

您可以使用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']); 
    }