2010-06-23 3 views
0

I 보이는 배열을배열을 통해 반복 부모 자식 관계 테이블에 삽입

 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 에이 통해 I을 반복 수행하고 부모 - 자식 - 손자 관계 데이터를 저장 동일한 테이블 (MYSQL) 내에서.

또한 삽입 된 데이터 (부모 - 자식 - 손자)를 순서대로 검색하는 쿼리 예는 훌륭합니다.

희망 사항은 제 질문에 의미가 있습니다. 실례지만, 더 많은 정보를 드릴 수 있습니다.

감사합니다.

+0

깊이가 무한합니까, 아니면 손주 (예 : 손자가 잎이됩니다)에서 멈추나요? – greg0ire

+0

음 깊이는 메인 서브 서브 서브 인 3입니다. 나는 그것이 더 깊게 갈 것이라고 생각하지 않는다. – bharath

답변

0

나는 다음과 같이 MySQL의 테이블에 부모에 대한 참조 키를 제안한다

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

다음 PHP 코드에서, 당신은 트리 모델을 가지고 있고 당신은 ID 인덱스에있는 모든 항목을 읽을 배열을 만든 다음 트리로 어셈블합니다. 그럼 당신은 그냥 빈 배열을 만들을 작성 sequencially 값을 읽을 필요

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

:

$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); 

트리에서 값을 읽으려면, 나는 재귀 함수를 사용합니다.

$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

+0

예 나는 누락 된 부분을 깨달았습니다 :) 그에 따라 편집되었습니다. – slaphappy

+0

잘 안녕 adds totoree에 전달 된 부모 매개 변수는 뭐죠? 또한 함수는 $ tree_part?를 반환 할 것인가? 오, 내가 $ items.push PHP에서 작동하지 않을 것이라고 생각하므로 내가 array_push 될 상상할거야?. – bharath

0

당신은 3 열 id, name있는 테이블을 생성하여이 작업을 수행 할 수 parentid

당신은 배열을 통해 걸어 당신이 가서 줄을 삽입 (또는에 SQL 쿼리를 구축하기 위해 PHP array_walk 기능을 사용할 수 있습니다

나중에 실행) :

$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']); 
    } 
관련 문제