动态导入树

时间:2018-06-01 17:42:35

标签: php mysql arrays laravel nested-sets

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

相反,这个结构

enter image description here

我明白了

enter image description here

如您所见,第二级和第三级的单词是重复的。我有什么想法可以解决这个问题吗?

1 个答案:

答案 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);