PHP数组转化为树形结构竟然能如此简便

PHP 把数据转化为树形结构

  1. 只需要单个字段

转化前

array(2) {
  [0] => array(7) {
    ["id"] => int(1)
    ["cid"] => int(1)
    ["user_id"] => int(1)
    ["create_time"] => string(1) "1"
    ["content"] => string(6) "测试"
    ["pid"] => int(0)
    ["beid"] => int(1)
  }
  [1] => array(7) {
    ["id"] => int(2)
    ["cid"] => int(1)
    ["user_id"] => int(1)
    ["create_time"] => string(1) "1"
    ["content"] => string(9) "测试啊"
    ["pid"] => int(1)
    ["beid"] => int(1)
  }
}

代码

/**
     * 树形结构(只要单个字段和id)
     * @param $list   数组
     * @param string $id 数据表的id名称
     * @param string $pid 父ID
     * @param string $name 单个字段(这里以content为例)  
     * @return array|mixed
     */
    function tree($list, $id = 'id', $pid = 'pid', $name = 'content')
    {
        $data = [];
        foreach ($list as $row) {
            $data[$row[$id]][$name] = $row[$name];
            $data[$row[$pid]]['children'][$row[$id]] = &$data[$row[$id]];
        }
        return isset($data[0]['children']) ? $data[0]['children'] : [];
    }

转化的结果示例为

array(1) {
  [1] => array(2) {
    ["content"] => string(6) "测试"
    ["children"] => array(1) {
      [2] => array(1) {
        ["content"] => string(9) "测试啊"
      }
    }
  }
}

2.需要转化所有数据

转化前

array(2) {
  [0] => array(7) {
    ["id"] => int(1)
    ["cid"] => int(1)
    ["user_id"] => int(1)
    ["create_time"] => string(1) "1"
    ["content"] => string(6) "测试"
    ["pid"] => int(0)
    ["beid"] => int(1)
  }
  [1] => array(7) {
    ["id"] => int(2)
    ["cid"] => int(1)
    ["user_id"] => int(1)
    ["create_time"] => string(1) "1"
    ["content"] => string(9) "测试啊"
    ["pid"] => int(1)
    ["beid"] => int(1)
  }
}

代码

/**
     * 树形结构(所有数据)
     * @param $list   数组
     * @param string $id id名称
     * @param string $pid 父级id
     * @param string $child 数组分类后,子数组的名称
     * @param int $root 一级分类父ID
     * @return array
     */
    function list_to_tree($list, $id = 'id', $pid = 'pid', $child = '_child', $root = 0)
    {
        // 创建Tree
        $tree = array();
        if (is_array($list)) {
            // 创建基于主键的数组引用
            $refer = array();
            foreach ($list as $key => $data) {
                $refer[$data[$id]] =& $list[$key];
            }
            foreach ($list as $key => $data) {
                // 判断是否存在parent
                $parentId = $data[$pid];
                if ($root == $parentId) {
                    $tree[] =& $list[$key];
                } else {
                    if (isset($refer[$parentId])) {
                        $parent =& $refer[$parentId];
                        $parent[$child][] =& $list[$key];
                    }
                }
            }
        }
        return $tree;
    }

转化结果示例为

array(1) {
  [0] => array(8) {
    ["id"] => int(1)
    ["cid"] => int(1)
    ["user_id"] => int(1)
    ["create_time"] => string(1) "1"
    ["content"] => string(6) "测试"
    ["pid"] => int(0)
    ["beid"] => int(1)
    ["_child"] => array(1) {
      [0] => array(7) {
        ["id"] => int(2)
        ["cid"] => int(1)
        ["user_id"] => int(1)
        ["create_time"] => string(1) "1"
        ["content"] => string(9) "测试啊"
        ["pid"] => int(1)
        ["beid"] => int(1)
      }
    }
  }
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值