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
发表评论