【问题标题】:Import tree dynamically动态导入树
【发布时间】:2018-11-11 21:36:57
【问题描述】:

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

取而代之的是这个结构

我明白了

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

【问题讨论】:

  • 如果您想吸引更多人寻求帮助,您可能需要考虑使用英语价值观
  • 是的,忘了这个。固定

标签: php mysql arrays laravel nested-sets


【解决方案1】:

我不确定您的 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);

【讨论】:

  • 我需要使用baum的打包工具来索引动态添加的children
  • 好的,现在我发现我错过了问题中 Baum 的部分。我也许可以使用maketree 函数来为您工作。
猜你喜欢
  • 2021-02-03
  • 2019-10-31
  • 1970-01-01
  • 2012-06-07
  • 2021-01-05
  • 2018-11-19
  • 2017-12-12
  • 2019-05-28
  • 2022-11-11
相关资源
最近更新 更多