PHP Array to jsTree


PHP Array to jsTree

我有一个$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; } 

现在你都完成了!