处理树数组的最佳方法

时间:2013-04-13 02:25:01

标签: php arrays cakephp tree

我有一个来自cakephp 2.0树行为的树数组,我需要将它分开,所以我可以为每个级别构建一个选择器。以下是该数组的示例:

Array
(
    [25] => Global
    [26] => _Region1
    [29] => __Pais1
    [41] => ___Distrito1
    [42] => ___Distrito2
    [30] => __Pais2
    [43] => ___Distrito1
    [44] => ___Distrito2
    [31] => __Pais3
    [45] => ___Distrito1
    [32] => __Pais4
    [46] => ___Distrito1
    [27] => _Region2
    [33] => __Pais1
    [47] => ___Distrito1
    [34] => __Pais2
    [48] => ___Distrito1
    [35] => __Pais3
    [36] => __Pais4
    [28] => _Region3
    [37] => __Pais1
    [38] => __Pais2
    [39] => __Pais3
    [40] => __Pais4
)

现在我需要的是为全局创建一个选择,为pais1另一个选择region1,为disctrito1另一个选择

问题是我可以使用id来生成它,因为用户会改变它。

操作此数组的最佳方法是什么,以便为数组的每个级别构建一个select。

提前致谢。

1 个答案:

答案 0 :(得分:3)

您可以通过find('threaded')将树作为嵌套数组。这将为您提供树中的每个项目,其中“children”键包含所有子节点作为数组;

Retrieving Your Data - find('threaded')

然而,如所指出的,因为内容将由用户修改,所以树的深度可能改变。为了适应这些变化,您需要使用'递归函数'来遍历树,无论其深度如何

样机代码:

echo $this->MyTreeHelper->buildTreeDropDowns($treeData);


class MyTreeHelper extends AppHelper {

    public function buildTreeDropDowns($treeData)
    {
         $output = '';

         foreach($treeData as $item) {
              $output .= createAdropDown($item);

              if (!empty($item['children'])) {
                   $output .= $this->buildTreeDropDowns($item['children']);
              }
         }
         return $output;
    }
}