老实说,我并没有深入研究 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 调用了 makeTree 方法,该方法将递归地创建树“分支”。所以是的,这是一个使用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 我刚刚创建的。
享受吧!
【讨论】: