php - 动态导入树

标签 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

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

最佳答案

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

关于php - 动态导入树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50648590/

相关文章:

java - 带有一组选项的代码,用于打印联系人列表、联系人数量、联系人平均年龄以及每种类型联系人的数量

java - 从数组中删除零值

javascript - 访问对象内部的属性

mysql - Nginx Docker 卷为空

php - 从另一个站点运行的外部 PHP 可以访问在 ASP.net 托管站点上运行的 mysql 吗?

mysql - 在 select 语句中更新 mysql

php - 更改动态按钮的 CSS

javascript - 如何检测 Firefox 4.6 ubuntu 上安装的扩展

php - 在布局中的 Laravel 5.3 View 中包含 PHP 变量

php - Facebook API FQL 多查询获取 Actor 姓名和 ID