PHP无限极分类(循环不使用递归改版)

有时我们在写无限极分类时,需要根据列表,
将子分类放到父分类中,这是就需要我们进行循环操作。
这网上找了一个不错的函数,这里根据自己的需求做了修改。
记录一下,便于以后使用: 方法一:

/**
 * [list_to_tree 无限极分类树状图]
 * @param  [type] $lists    [列表]
 * @param  string $childKey [子集名称]
 * @param  string $id       [主键ID]
 * @param  string $pid      [父子关联ID]
 * @return [type]           [description]
 */
function list_to_tree($lists, $childKey = 'children', $id = 'id', $pid = 'pid'){
    $items = [];
    $tree = [];
    foreach($lists as &$item){
        // 获取出每一条数据的父id
        $ipid = &$item[$pid];
        // 将每一个item的引用保存到$items中
        $items[$item[$id]] = &$item;
        // 如果在map中没有设置过他的pid, 说明是根节点, pid为0,
        if (isset($items[$ipid])) {
            // 如果在map中没有设置过他的pid, 则将该item加入到他父亲的叶子节点中
            $pItem = &$items[$ipid];
            $pItem[$childKey][] = &$item;
        } else {
            // 将pid为0的item的引用保存到$tree中
            $tree[$item[$id]] = &$item;
        }
    }
    return $tree;
}

方法二:

/**
 * [list_to_tree 无限极分类树状图]
 * @param  [type] $lists    [列表]
 * @param  string $childKey [子集名称]
 * @param  string $id       [主键ID]
 * @param  string $pid      [父子关联ID]
 * @return [type]           [description]
 */
public function list_to_tree($lists, $childKey = 'children', $id = 'id', $pid = 'pid')
{
    $items = [];
    foreach ($lists as $v) {
        $items[$v[$id]] = $v;
    }
    $tree = [];
    foreach ($items as $id => $item) {
        if (isset($items[$item[$pid]])) {
            $items[$item[$pid]][$childKey] = &$items[$id];
        } else {
            $tree[] = &$items[$id];
        }
    }
    return $tree;
}

冯奎博客
请先登录后发表评论
  • latest comments
  • 总共0条评论