【解决方案1】:

老实说,我并没有深入研究 javascript sn-p,但我可以在这里分享一些我过去使用过的代码,而且效果很好。实际上,我之前已经找到了一些 sn-p 并为我自己改进了它。目前没有那个确切的链接(如果有的话会更新),但这就是我所拥有的:

在这里你可以使用无限深的树枝。

假设我们遵循 MyTree 模型:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class MyTree extends Model
{
    protected $table = 'my_tree';

    protected $fillable = [
        'id',
        'parent_id',
        'value',
    ];
}

所以我们可以通过查询从 DB 中获取所有 MyTree 项,然后使用 getNestedItems 方法将其转换为这样的树数组:

注意:这里有一些额外的内容,但它不会阻止您获得解决方案。这是排除某些根项目的附加参数:

public function getNestedItems($exclude_parent_id = null): array
{
    $arr = MyTree::select([
        'id',
        'parent_id',
        'value',
    ])
        ->when(isset($exclude_parent_id), function ($query_id) use ($exclude_parent_id) {
            return $query_id->where('id', '!=', $exclude_parent_id);
        })
        ->get()
        ->toArray();

    if (count($arr) > 0) {
        $new = [];
        foreach ($arr as $a) {
            $parent_id = empty($a['parent_id']) ? 0 : $a['parent_id'];
            $new[$parent_id][] = $a;
        }

        $tree = $this->mekeTree($new, $new[0], $exclude_parent_id);

        return [
            'count' => count($arr),
            'tree' => $tree,
        ];
    } else {
        return [
            'count' => 0,
            'tree' => [],
        ];
    }
}

如您所见,我们从 getNestedItems 调用了 ma​​keTree 方法,该方法将递归地创建树“分支”。所以是的,这是一个使用PHP references 的递归函数:

protected function mekeTree(&$list, $parent, $exclude_parent_id): array
{
    $tree = [];
    foreach ($parent as $k => $l) {
        if(isset($list[$l['id']])) {
            if ($l['id'] == $exclude_parent_id) {
                continue;
            }
            $l['children'] = $this->mekeTree($list, $list[$l['id']], $exclude_parent_id);
        }
        $tree[] = $l;
    }

    return $tree;
}

还有 here is a Gist 我刚刚创建的。

享受吧!

【讨论】: