Халлёшен всем,
У меня есть иерархический массив, который я получаю от 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);
}
}
}
Чтобы скопировать набор данных, попробуйте это:
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());
}
}
}
Его непроверенный аналог псевдокода. Это больше намек.
Вы можете иметь третий индекс в качестве parent_id, а для корневого элемента сделать parent_id равным 0, а в соответствующих дочерних элементах родительский_идентификатор должен быть идентификатором родителя.
для корневого элемента: Array ( [id] => 1, [text] => 'a', [parent_id] => 0 ); для 1-го ребенка это было бы как Array ( [id] => 2, [text] => 'a', [parent_id] => 1 );