Импортировать дерево динамически - PullRequest
0 голосов
/ 01 июня 2018

Работа с вложенными в laravel пакетами Баума и пытается импортировать дерево в базу данных 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 голосов
/ 01 июня 2018

Я не уверен, как работает ваш класс 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);
...