#对象转数据概念
/**
* 对象 转 数组
*
* @param object $obj 对象
* @return array
*/
function object_to_array($obj) {
$obj = (array)$obj;
foreach ($obj as $k => $v) {
if (gettype($v) == 'resource') {
return;
}
if (gettype($v) == 'object' || gettype($v) == 'array') {
$obj[$k] = (array)object_to_array($v);
}
}
return $obj;
}
/**
* @return array
* 分类列表数据展示
*/
public function Index(Request $request)
{
/*$data = Category::orderBy('id', 'asc')->get();
if (!$data->count()) {
return $this->getResponse('' , ResponseCode::ERR_PARAMETER, '没有找到对应数据');
}
$parentList = array();
foreach ($data as $key => $val) {
if ($val['parent_id'] == 0) {
$parentList [$key]['sort'] = $val['sort'];
$parentList [$key]['id'] = $val['id'];
$parentList [$key]['icon'] = url(EnumBase::IMGPATH . $val['icon']) ?? '';
$parentList [$key]['descriptor'] = $val['descriptor'];
$parentList [$key]['disable'] = $val['disable'];
$parentList [$key]['created_at'] = $val['created_at'];
$parentList [$key]['parent_id'] = $val['parent_id'];
$parentList [$key]['category_name'] = $val['category_name'];
} else {
$children [$key]['sort'] = $val['sort'];
$children [$key]['id'] = $val['id'];
$children [$key]['icon'] = url(EnumBase::IMGPATH . $val['icon']) ?? '';
$children [$key]['descriptor'] = $val['descriptor'];
$children [$key]['disable'] = $val['disable'];
$children [$key]['created_at'] = $val['created_at'];
$children [$key]['parent_id'] = $val['parent_id'];
$children [$key]['category_name'] = $val['category_name'];
}
}
$parentList = array_values($parentList);
if (!empty ($parentList) && !empty ($children)) {
foreach ($parentList as $key => $list) {
foreach ($children as $sk => $sl) {
if ($sl ['parent_id'] == $list ['id']) {
$parentList [$key] ['children'] [] = $children [$sk];
}
}
}
}
$data = ['list' => $parentList];
return $this->getResponse('success' , ResponseCode::OK, $data);*/
// 重写部分:
$dataContent = Category::orderBy('id', 'asc')->get();
foreach ($dataContent as $key => $val) {
$arr [$key]['sort'] = $val['sort'];
$arr [$key]['id'] = $val['id'];
$arr [$key]['icon'] = url(EnumBase::IMGPATH . $val['icon']) ?? '';
$arr [$key]['descriptor'] = $val['descriptor'];
$arr [$key]['disable'] = $val['disable'];
$arr [$key]['created_at'] = $val['created_at'];
$arr [$key]['parent_id'] = $val['parent_id'];
$arr [$key]['category_name'] = $val['category_name'];
}
$data = $this->get_attr($arr, 0);
$num = count($data);
//return $arr;
//return adminResult("请求成功", 1, $num, $data);
$data = ['num' => $num , 'data' => $data];
return $this->getResponse('success' , ResponseCode::OK, $data);
// return result($num, 0, $data);
}
//递归
public function get_attr($a, $pid)
{
$tree = array(); //每次都声明一个新数组用来放子元素
foreach ($a as $v) {
if ($v['parent_id'] == $pid) { //匹配子记录
$v['children'] = $this->get_attr($a, $v['id']); //递归获取子记录
if ($v['children'] == null) {
unset($v['children']); //如果子元素为空则unset()
}
$tree[] = $v; //将记录存入新数组
}
}
return $tree; //返回新数组
}
第二种方法总结:
调用: $id = $request->id;
$this->cate($id);
分享链接: https://blog.csdn.net/qq_44718170/article/details/108555482
//无限极分类接口1
public function cate($id)
{
$data = Category::orderBy('id', 'asc')->get()->toArray();
//return $this->success($this->getTree($id , $data));
$res = $this->getTree($id , $data);
header('Content-Type:application/json; charset=utf-8');
echo (json_encode($res));die;
// 这里必须加header 头文件,否则返回string 类型的json
//header('Content-Type:application/json; charset=utf-8');
//exit(json_encode($res,JSON_UNESCAPED_UNICODE));
//header('Content-Type:application/json; charset=utf-8');
//echo json_encode($res);
}
function getTree($id,$array){
//第一步 构造数据
$items = array();
foreach($array as $value){
$items[$value['id']] = $value;
}
//第二部 遍历数据 生成树状结构
$tree = array();
foreach($items as $key => $value){
if(isset($items[$value['parent_id']])){
$items[$value['parent_id']]['son'][] = &$items[$key];
}else{
if((empty($id))||($id==$value['id']))
$tree[] = &$items[$key];
}
}
return $tree;
}
第三种方法:
地址: https://blog.csdn.net/cfun_goodmorning/article/details/77745304
$dataContent = Category::orderBy('id', 'asc')->get()->toArray();
$re = $this->array_to_tree($dataContent , 'id' , 'parent_id');
return response()->json($re);
//需要注意的是,$list数组的格式,是否符合递归的要求
function array_to_tree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root = 0)
{
// 创建Tree
$tree = array();
if (is_array($list)) {
// 创建基于主键的数组引用
$refer = array();
foreach ($list as $key => $data) {
$list[$key][$child] = [];
$refer[$data[$pk]] =& $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;
}
第四种方法:
$re = $this->tree();
return response()->json($re);
public function tree($parentId = 0)
{
$rows = Category::where('parent_id', $parentId)->get()->toArray();
$arr = array();
if (sizeof($rows) != 0){
foreach ($rows as $key => $val){
$val['list'] = $this->tree($val['id']);
$arr[] = $val;
}
return $arr;
}
}
第五种方法:
调用:
$dataContent = Category::orderBy('id', 'asc')->get();
$re = $this->getTree($dataContent , 'category_name');
return response()->json($re);
//一般传进三个参数。默认P_id=0;
public function getTree($data,$field_name,$field_id="id",$field_pid="parent_id",$pid=0){
$parentList = [];
foreach ($data as $k => $v) {
if($v->$field_pid == $pid) {
//$v['_cate_name'] = $v[$field_name];
//$arr[$k] = $data[$k];
$parentList [$k]['sort'] = $v['sort'];
$parentList [$k]['id'] = $v['id'];
$parentList [$k]['icon'] = url(EnumBase::IMGPATH . $v['icon']) ?? '';
$parentList [$k]['descriptor'] = $v['descriptor'];
$parentList [$k]['disable'] = $v['disable'];
$parentList [$k]['created_at'] = $v['created_at'];
$parentList [$k]['parent_id'] = $v['parent_id'];
$parentList [$k]['category_name'] = $v['category_name'];
$parentList = array_values($parentList);
foreach ($data as $k1 => $v1) {
if ($v1->$field_pid == $v->$field_id) {
//$v1['_cate_name'] = '|----'.$v1[$field_name];
//$parentList[$k]['children'][] = '|----'.$v1[$field_name];
$parentList[$k]['children'][] = $data [$k1];
}
}
}
}
return $parentList;
}
第六种:
laravel 无限极分类
数据表结构
$classifys = Classify::withCount('children',)
->where('user_id',$user->id)
->where('pid',$pid)
->get();
模型
<?php
/**
* Created by Reliese Model.
* Date: Tue, 29 Oct 2019 03:58:39 +0000.
*/
namespace App\Models;
use Reliese\Database\Eloquent\Model as Eloquent;
/**
* Class Classify
*
* @property int $id
* @property int $user_id
* @property int $pid
* @property string $name
* @property \Carbon\Carbon $estimated_time
* @property \Carbon\Carbon $created_at
* @property \Carbon\Carbon $updated_at
* @property string $deleted_at
*
* @package App\Models
*/
class Classify extends Eloquent
{
use \Illuminate\Database\Eloquent\SoftDeletes;
protected $table = 'classify';
protected $casts = [
'user_id' => 'int',
'pid' => 'int'
];
protected $fillable = [
'user_id',
'pid',
'name',
];
/**
* 获取子模块
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function childrenModule()
{
return $this->hasMany($this, 'pid', 'id');
}
/**
* 递归获取子模块
* @return mixed
*/
public function children()
{
return $this->childrenModule()->with('children');
}
}
第七种:laravel 商品无限级分类
链接模块: https://blog.csdn.net/qq_28114645/article/details/71713574
//商品类别查询
public function topParent()
{
$where['commodType_depth'] = 1;
$where['commodType_status'] = 1;
$where['commodType_parentId'] = null;
return $this->where($where)->get(['commodType_id', 'commodType_name']);
}
//商品分类子集递归查询
public function child($commodType_id)
{
$arr[] = Array();
$where['commodType_status'] = 1;
$where['commodType_parentId'] = $commodType_id;
if ($arr = $this->where($where)->get(['commodType_id', 'commodType_name'])) {
foreach ($arr as $k => $v) {
$arr[$k]['child'] = $this->child($v->commodType_id);
}
}
return $arr;
}
//商品分类列表 无限级
public function commod_type_list()
{
$arr = $this->topParent();
if ($arr) {
foreach ($arr as $k => $v) {
$arr[$k]['child'] = $this->child($v->commodType_id);
}
}
return $arr;
}