2010-06-23 63 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']); 
    }