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

Халлёшен всем,

У меня есть иерархический массив, который я получаю от 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

Решение

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

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());
}
}
}

Его непроверенный аналог псевдокода. Это больше намек.

0

Другие решения

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

для корневого элемента:

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

для 1-го ребенка это было бы как

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

По вопросам рекламы [email protected]