使用laravel-nested设置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();
}
相反,这个结构
我明白了
如您所见,第二级和第三级的单词是重复的。我有什么想法可以解决这个问题吗?
答案 0 :(得分:0)
我不确定你的Chain类是如何工作的,所以我使用关联数组来做到这一点。您必须改变它以使用您的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);