我有一个$key => $value
对的数据数组,我想把它漂亮地显示给用户。当我在想办法的时候,我想到了:
如果我能将JSON传递给页面并制作javascript树,那就太好了。
然后我找到了jstreet,它似乎完全符合我的要求。在阅读了文档之后,我找到了需要传递的JSON格式来创建树—所以我创建了一个递归函数来将其转换为正确的数组格式,然后json_encode
对其进行处理并将其传递给构造函数。问题是,json_encode
不能正确地创建children
节点,因此它完全无法使用。我喜欢通用的解决方案,不需要为一种特定类型的显示(在本例中是jsTree)格式化来自源的数据,并决定能够使用jsTree有效地获取任何数组并显示它。经过几个小时的搜索,我无法找到一个现成的解决这个问题的方法。
所以,我的问题是,什么是最好的方式来转换PHP数组的东西,jstreet将很好地发挥。额外的好处是,如果子节点没有图标,也没有图标所在的空间,因为我个人不处理文件系统,不需要没有子节点的图标。
从Array创建jtree
首先,让我们解决如何将数组转换为jsTree可以很好地使用的东西,因为json_encode
不能正常工作,我们将得到无序列表格式。由于输入数组既可以包含标量数据,也可以包含数组,因此它必须是递归的。
为此,我们将创建array2jstree
函数,该函数实质上将数组转换为非特定于jtree的无序列表,只有一个class
异常。
function array2jstree($ar){
$out = '';
foreach($ar as $k => $v){
$out .= "<li>$k";
if(is_array($v)){
$out .= array2jstree($v);
}else{
$out .= "<ul><li class='"jstree-nochildren'">$v</li></ul>";
}
$out .= '</li>';
}
return "<ul>$out</ul>";
}
这样做的是遍历数组中的每个元素,如果是另一个数组,调用自己并在'父' <li>
元素下面创建一个无序列表,如果不是数组,仍然扩展到一个新列表,但它只包含值。这样,一个数组:
array(
'data' => 'value'
)
将在data
的基础上展开,显示value
作为它的子节点。
注意非数组值的类是jstree-nochildren
。这个类不是jsTree的一部分,但是用于任何没有子元素的项目(因此图标可以成功删除)
现在,所需要做的就是将函数放入,并将一个数组传递给它,以获得一个带有图标的良好工作jtree。把它放在一起来展示如何使用它(以echo
为例,但可以很容易地作为变量传递给模板引擎等):
echo '<div id="cTree">'. array2jstree(array('name' => $myArray)) .'</div>';
传递一个新数组给函数的原因是它有一个定义的'根'节点来展开,如果你不需要根节点,省略它。
和JS将其初始化为jtree:
<script>
$('#cTree').jstree();
</script>
现在您有了一个将数组转换为jtree的插入式函数!现在,回到没有子节点的节点没有图标的问题,我们将基于之前分配的类jstree-nochildren
创建一个样式,并使用jsTree将列表转换为的样式,您唯一需要添加的样式是:
.jstree-nochildren > a > .jstree-icon { display:none !important; }
现在你都完成了!