如何从另一个数组中获取树状数组?

时间:2014-01-23 20:06:32

标签: php arrays

我的数据库中有一个存储菜单项的表,其中每个项都有ID,NAME和FATHER ID,我需要安排它并获得多个级别的树状结构。我需要的是一个带顶级菜单的数组,然后每个元素都带有包含子菜单的'childs'数组,这个子菜单及其'childs'数组包含各自的子子菜单。英语不是我的母语所以忍受我:)

更好理解的一个例子。

我有以下数组形式的菜单:

1- System
  2- Profile
  3- Account
    4- Info
    5- Security
6- Logout

使用以下数组:

$array = array(
   array('id' => 1, 'item'=>'System', 'id_father' => null),
   array('id' => 2, 'item'=>'Profile', 'id_father' => 1),
   array('id' => 3, 'item'=>'Account', 'id_father' => 2),
   array('id' => 4, 'item'=>'Info', 'id_father' => 3),
   array('id' => 5, 'item'=>'Security', 'id_father' => 3),
   array('id' => 6, 'item'=>'Logout', 'id_father' => 1)
);

我如何获得以下内容? :

array(
  array('id' => 1, 'item'=>'System', 'id_father' => null,
     'childs' => array(
         array('id' => 2, 'item'=>'Profile', 'id_father' => 1),
         array('id' => 3, 'item'=>'Account', 'id_father' => 2,
           'childs' => array(
              array('id' => 4, 'item'=>'Info', 'id_father' => 3),
              array('id' => 5, 'item'=>'Security', 'id_father' => 3)
           ),
         ),
      ),
  ),
  array('id' => 6, 'item'=>'Logout', 'id_father' => 1)
);

2 个答案:

答案 0 :(得分:1)

$array更改为:

$array = array(
 array('id' => 1, 'item'=>'System', 'id_father' => null),
 array('id' => 2, 'item'=>'Profile', 'id_father' => 1),
 array('id' => 3, 'item'=>'Account', 'id_father' => 1), // set id_father = 1
 array('id' => 4, 'item'=>'Info', 'id_father' => 3),
 array('id' => 5, 'item'=>'Security', 'id_father' => 3),
 array('id' => 6, 'item'=>'Logout', 'id_father' => null) // edited to set id_father = null
);

做到:

function tree( $ar, $pid = null ) {
$op = array();
foreach( $ar as $item ) {
    if( $item['id_father'] == $pid ) {
        $op[$item['id']] = array(
            'item' => $item['item'],
            'id_father' => $item['id_father'],
            'id' => $item['id']
        );
        // using recursion
        $children =  tree( $ar, $item['id'] );
        if( $children ) {
            $op[$item['id']]['childs'] = $children;
        }
    }
 }
 return $op;
}


$tree = tree($array);

echo '<pre>';
print_r( $tree);
echo '</pre>';

// OUTPUT

Array
(
 [1] => Array
    (
        [item] => System
        [id_father] => 
        [id] => 1
        [childs] => Array
            (
                [2] => Array
                    (
                        [item] => Profile
                        [id_father] => 1
                        [id] => 2
                    )

                [3] => Array
                    (
                        [item] => Account
                        [id_father] => 1
                        [id] => 3
                        [childs] => Array
                            (
                                [4] => Array
                                    (
                                        [item] => Info
                                        [id_father] => 3
                                        [id] => 4
                                    )

                                [5] => Array
                                    (
                                        [item] => Security
                                        [id_father] => 3
                                        [id] => 5
                                    )

                            )

                    )

            )

    )

[6] => Array
    (
        [item] => Logout
        [id_father] => 
        [id] => 6
    )

)

答案 1 :(得分:0)

不需要以这种方式递归:

$pool = array();
foreach ($array as $value) {
    $pool[$value['id']] = $value;
    $pool[$value['id']]['children'] = array();
}
foreach ($pool as $k => $v) {
    if ($v['id_father']) {
        $pool[$v['id_father']]['children'][] = &$pool[$k];
    }
    else
        $parent[] = $v['id'];
}
$result = array();
foreach ($parent as $val) {
    $result = $result + $pool[$val];
}
print_r($result);