Импортировать дерево динамически

Работа с вложенными laravel-пакетами устанавливает пакет Baum и пытается импортировать дерево в базу данных mysql. Импорт данных:

1. FirstLevelWord1 - SecondLevelWord1 - ThirdLevelWord1 - FourthLevelWord1
2. FirstLevelWord1 - SecondLevelWord1 - ThirdLevelWord1 - FourthLevelWord2
3. FirstLevelWord1 - SecondLevelWord1 - ThirdLevelWord1 - FourthLevelWord3

Мне нужно обновить те же слова вместо записи дубликатов в базе данных. Но теперь я могу сделать это только со словом первого уровня — не знаю, как динамически обновлять одни и те же слова на втором и последующих уровнях.

Метод импорта

foreach ($words as $value){
$c = explode("-", $value);
$root = Chain::firstOrCreate(['cWord' => $c[0]]);

for ($i = 1; $i < count($c) ; $i++) {
$prevChild = null;
if (Chain::where('cWord', $c[$i])->first()){
$prevChild = Chain::where('cWord', $c[$i-1])->first();
}

$child = Chain::create(['cWord' => $c[$i]]);

if($i == 1){
$child->makeChildOf($root);
} else {
$child->makeChildOf(
$root->getDescendants()[count($root->getDescendants())-1]);
}
}

$node = Chain::where('cWord', '=', $c[0])->first();
}

Вместо этой структуры

введите описание изображения здесь

Я понял

введите описание изображения здесь

Как видите, слова на втором и третьем уровне дублируются. Любые идеи, как я могу это исправить?

1

Решение

Я не уверен, как работает ваш класс Chain, поэтому я сделал это с помощью ассоциативных массивов. Вам придется изменить это, чтобы работать с вашим классом цепочки.

$words = [
"бить - разбить - разбивать - разбивание",
"бить - разбить - разбивать - разбиватель",
"бить - разбить - разбивать - разбивка",
];

$structure = [];

function fill(array $structure, string $x, ...$xs): array {
if (!isset($structure[$x])) {
$structure[$x] = [];
}

if ($xs) {
$structure[$x] = fill($structure[$x], ...$xs);
}

return $structure;
}

foreach ($words as $value) {
$c = explode(" - ", $value);

$structure = fill($structure, ...$c);
}

print_r($structure);

Редактировать: я добавил код, чтобы его можно было использовать с buildtree метод. Я уверен, что Baum может быть интегрирован с вышеуказанной функцией, чтобы упростить все это.

function createBaumTree(array $structure): array
{
$baumTree = [];

foreach ($structure as $key => $value) {
if ($value) {
$baumTree[] = [
'name' => $key,
'children' => createBaumTree($value),
];
continue;
}

$baumTree[] = ['name' => $key];
}

return $baumTree;
}

$baumTree = createBaumTree($structure);

print_r($baumTree);
0

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

Других решений пока нет …

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