考虑到下面的文件夹层次结构,并将其保存到数据库表中:
top-
|- subtop1
|- subtop2
|- subsubtop1
查询返回:
ID NAME PARENT ID
1, top, null
2, subtop1, 1
3, subtop2, 1
4, subsubtop1, 3
我想将其转换为数组,然后转换为以下JSON格式:
{
"folder":
{
"fold_id": 1, "fold_name": "top", "fold_parent_fold_id": null,
"sub_folders":
{
"folder":
{
"fold_id": 2, "fold_name": "subtop1", "fold_parent_fold_id": 1,
"sub_folders": {}
},
"folder":
{
"fold_id": 3, "fold_name": "subtop2", "fold_parent_fold_id": 1,
"sub_folders":
{
"folder":
{
"fold_id": 4, "fold_name": "subsubtop1", "fold_parent_fold_id": 3,
"sub_folders":
{
}
}
}
}
}
}
}
这是我的代码(一个类的一部分):
public function buildTree ( $tree, $dir ) : array
{
$retarr = array();
foreach ($tree as $tnode)
{
var_dump($tnode);
if ( $tnode['folder']['fold_id'] == $dir['fold_parent_fold_id'])
{
if ( count($tnode['folder']['fold_id']['subfolders']) == 0 )
{
// Next line errors with " Cannot use a scalar value as an array "
$tnode['folder']['fold_id']['subfolders'] = array($dir['fold_id']=>$dir);
}
else
{
array_push($tnode['folder']['fold_id']['subfolders'], array($dir['fold_id']=>$dir) );
}
}
else
{
$tnode = $this->buildTree ($tnode, $dir);
}
var_dump($tnode);
array_push($retarr, $tnode);
}
return ($retarr);
}
这是从数据库获取扁平层次列表并调用buildTree函数逐步构建树形数组的函数:
public function getFolderTree ( $foldID ) : array
{
$foldContent = "";
$sql =<<<SQL
SELECT 1 oby,
fold_id,
fold_name,
fold_parent_fold_id
FROM (SELECT * FROM folders
ORDER BY fold_parent_fold_id, fold_id) items_sorted,
(SELECT @iv := ?) initialisation
WHERE find_in_set(fold_parent_fold_id, @iv)
AND length(@iv := concat(@iv, ',', fold_id))
UNION
SELECT 0 oby,
fold_id,
fold_name,
fold_parent_fold_id
FROM folders
WHERE fold_id = ?
ORDER BY 1, 4, 3
SQL;
$rows = $this->db->query($sql, $foldID, $foldID)->fetchAll();
$tree_array = array();
$dirs = array();
foreach ($rows as $row)
{
$subs = array();
//var_dump ( $row );
if ( $row['fold_parent_fold_id'] == null || count($dirs) == 0 )
{
$dirs[$row['fold_id']] = array ( "folder" => $row, "subfolders" => $subs );
$tree_array = $dirs;
}
else
{
$tree_array = $this->buildTree ($tree_array, $row);
}
var_dump ( $tree_array );
}
//var_dump($rows);
return ( json_encode($tree_array) );
}
如上所述,在buildTree函数中我遇到了一个错误:
// Next line errors with " Cannot use a scalar value as an array "
$tnode['folder']['fold_id']['subfolders'] = array($dir['fold_id']=>$dir);
然而,我也不确定我是否走的是正确的道路。我尝试使用从数据库中查询的方式将数据提取为JSON格式,但没有成功。
sub_folders
级别中,您有多个名为folder
的属性。属性名称必须在同一对象内唯一。 - M. Eriksson