2016-07-29 4 views
0

Hallöschen всех,дублировать существующую ветку дерева и сохранить его в базу данных

я имею иерархический массив, который я получаю от jsTree при копировании + вставить узел, и я хочу, чтобы вставить новое дерево ветвь в базу данных.

В моей таблице есть структура списка смежности с тремя полями «id», «text», «parent_id».

Структура может быть как ниже, так и более вложенной. Я не понял, как отслеживать родителя, чтобы узнать, какие дети принадлежат родительскому элементу, когда я рекурсивно перехожу к массиву.

Какой может быть самый чистый подход?

Array(
    [id] => 1 
    [text] => 'a' 
    [children] 
    =>Array(
     [0] => Array 
      (
      [id] => 2 
      [text] => 'b' 
      [children] => [] 
      ) 

     [1] => Array 
      (
      [id] => 3 
      [text] => 'c' 
      [children] => Array(
        [0] => Array(
           [id] => 4 
           [text] =>'' 
           [children]=>[] 
           ) 
           ) 
      ) 
    ) 
    ) 

Таким образом, окончательный гуманного, который работает для меня это один

function insertRows($data, $parent_id) 
{ 
    foreach ($data as $key => $value) { 
     if(isset($value['text'])) 
      // here insert the the $value['text'] and get the generated $id 

     if (isset($value['children'])) { 
      insertRows($value['children'], $id); 
     } 
    } 
} 
+0

Не уверен, в чем вопрос, но если предположить, что первый уровень является родительским, вы не можете просто «$ parent = $ array ['id'];'? – Epodax

+0

Я пытаюсь дублировать ветку. Поэтому требуется вставить первый узел, получить новый созданный идентификатор и создать его дочерние элементы с этим id как parent_id –

+0

, но что, если у меня есть 3 узла на одном уровне? Я вставляю 1-й, 2-й, 3-й и, если я иду рядом с вставкой детей из 1-го, у меня больше нет идентификатора 1-го числа. –

ответ

0

Чтобы скопировать набор данных, попробуйте следующее:

function insertRows($array, $parentId = null) 
{ 
    /** @var PDO $pdo */ 
    global $pdo; 

    foreach ($array as $key => $value) { 

     // Add text and parent id to table. 
     $pdo->query('INSERT INTO table SET text = "' . $value['text'] . '", parent_id = ' . $parentId); 

     if (is_array($value['children'])) { 
      insertRows($value['children'], $pdo->lastInsertId()); 
     } 
    } 
} 

Ее UNTESTED похож на псевдокоде. Это больше намек.

+0

Я пытаюсь вставить ветку как новые записи с новыми идентификаторами. Другими словами, I.m дублирует ветвь. –

+0

Я отредактировал свой ответ. может это вам помочь. Он полагается на использование идентификаторов автоинкремента для столбца 'id' –

+0

Большое спасибо, это помогло: D –

0

Вы можете иметь третий индекс, как parent_id и для корневого элемента сделать parent_id как 0 и в тир соответствующих детей ставить parent_id в качестве идентификатора родителя.

 
for root element : 

Array(
    [id] => 1, 
    [text] => 'a', 
    [parent_id] => 0 
); 

for 1st child it would be like 

Array(
    [id] => 2, 
    [text] => 'a', 
    [parent_id] => 1 
); 
Смежные вопросы