php树状结构

文章描述:

PHP菜单分类树状结构

 

 

获取子级的所有父级id

/**
 * 获取子级的所有父级id
 *
 * @param array  $list 列表
 * @param int    $id   id
 * @param string $pk   主键
 * @param string $pid  父键
 *
 * @return array id数组
 */
function children_parent_ids($list, $id, $pk = 'id', $pid = 'pid')
{
    $parentid = [];
    foreach ($list as $v) {
        if ($v[$pk] == $id) {
            $parentid[] = $v[$pk];
            $parentid = array_merge($parentid, children_parent_ids($list, $v[$pid], $pk, $pid));
        }
    }
    return $parentid;
}

列表转树形

/**
 * 列表转树形(根节点未知)
 *
 * @param array   $list  列表数组
 * @param string  $pk    主键名称
 * @param string  $pid   父键名称
 * @param int     $root  根节点id
 * @param string  $child 子节点名称
 *
 * @return array
 */
function array_to_tree($list = [], $pk = 'id', $pid = 'pid', $child = 'children')
{
    $parent_ids = [];
    foreach ($list as $val) {
        $pids = children_parent_ids($list, $val[$pk], $pk, $pid);
        $parent_ids[] = end($pids);
    }
    $parent_ids = array_unique($parent_ids);
    foreach ($list as &$v) {
        foreach ($parent_ids as $vp) {
            if ($v[$pk] == $vp) {
                $v[$pid] = 0;
            }
        }
    }
    return list_to_tree($list, $pk, $pid, 0, $child);
}

列表转树形

/**
 * 列表转树形
 *
 * @param array   $list  列表数组
 * @param string  $pk    主键名称
 * @param string  $pid   父键名称
 * @param int     $root  根节点id
 * @param string  $child 子节点名称
 *
 * @return array
 */
function list_to_tree($list = [], $pk = 'id', $pid = 'pid', $root = 0,  $child = 'children')
{
    $tree  = [];
    $refer = [];
    foreach ($list as $k => $v) {
        $refer[$v[$pk]] = &$list[$k];
    }
    foreach ($list as $key => $val) {
        $parent_id = 0;
        if (isset($val[$pid])) {
            $parent_id = $val[$pid];
        }
        if ($root == $parent_id) {
            $tree[] = &$list[$key];
        } else {
            if (isset($refer[$parent_id])) {
                $parent = &$refer[$parent_id];
                $parent[$child][] = &$list[$key];
            }
        }
    }
    return $tree;
}

 

使用$data是数组,$pk是数据表id


$pk = 'id';
$data = array(
	array('id'=>1,'menu_pid'=>0),
	array('id'=>2,'menu_pid'=>0),
	array('id'=>3,'menu_pid'=>1),
	array('id'=>4,'menu_pid'=>2)
);
$res = array_to_tree($data, $pk, 'menu_pid');
echo "<pre>";

print_r($res);

 

发布时间:2023/10/29

发表评论