递归调用 - PHP递归获取数据
需求场景:通过公司某个部门的总监名称获取所有该部门的员工。
比如,通过总监获取所有副总监,再通过各个副总监获取所有各个副总监对应的经理,再通过经理获取对应经理的员工。
mysql的表结构这么设计的,总监的id是1,那么副总监的parent_id就是1,如果副总监的id分别是2、3、4、5等等,那么各个经理的parent_id就是2、3、4、5,依次类推形成一个递归的数据。
问1:PHP如何通过递归一次性把所有总监以下的数据保存到一个变量呢?
问2:取出数据后如何区分哪些是副总监哪些是经理哪些是一线员工呢?
问3:如何分页?(按照我的理解,即使是分页也需要把全部数据递归完毕之后再进行计算,而不是limit 1,10等形式分页)
问题有点多,还请各位大拿请教,多谢。
如下是我的代码。貌似死循环了。。。
<code>public function recuresion($res) { foreach ($res as $k => $v) { $tmpRes[] = $this->obj->getResult($v['id']); //假设通过该方法获取副总监、经理、员工 if (!empty($tmpRes)) { return $this->recuresion($tmpRes); } else { return $tmpRes; } } } $a = recuresion($res); //这里假设$res是获取的总监的数据 print_r($a);</code>
回复内容:
需求场景:通过公司某个部门的总监名称获取所有该部门的员工。
比如,通过总监获取所有副总监,再通过各个副总监获取所有各个副总监对应的经理,再通过经理获取对应经理的员工。
mysql的表结构这么设计的,总监的id是1,那么副总监的parent_id就是1,如果副总监的id分别是2、3、4、5等等,那么各个经理的parent_id就是2、3、4、5,依次类推形成一个递归的数据。
问1:PHP如何通过递归一次性把所有总监以下的数据保存到一个变量呢?
问2:取出数据后如何区分哪些是副总监哪些是经理哪些是一线员工呢?
问3:如何分页?(按照我的理解,即使是分页也需要把全部数据递归完毕之后再进行计算,而不是limit 1,10等形式分页)
问题有点多,还请各位大拿请教,多谢。
如下是我的代码。貌似死循环了。。。
<code>public function recuresion($res) { foreach ($res as $k => $v) { $tmpRes[] = $this->obj->getResult($v['id']); //假设通过该方法获取副总监、经理、员工 if (!empty($tmpRes)) { return $this->recuresion($tmpRes); } else { return $tmpRes; } } } $a = recuresion($res); //这里假设$res是获取的总监的数据 print_r($a);</code>
貌似纯 SQL 就能搞定,不需要 PHP 掺和……
问 1:
<code>select id, name, parent_id from (select * from employee order by parent_id, id) sorted, (select @pv := '1') initialisation where find_in_set(parent_id, @pv) > 0 and @pv := concat(@pv, ',', id) </code>
问 2:
外面再套一层就好了:select * from (
问 1 的 SQL) e1 where not exists (select * from employee e2 where e2.parent_id = e1.id)
问 3:
既然是纯 SQL 的话,直接 limit
分页就好了。
非要 PHP 的话:
<code>public function recursion($res) { $output = array(); foreach ($res as $k => $v) { $tmpRes = $this->obj->getResult($v['id']); $output []= $v; if (!empty($tmpRes)) { $output = array_merge($output, $this->recursion($tmpRes)); } } return $output; } $a = recursion($res);</code>
呵呵,既然你有如此个性化的需求,就应该有一个性化的专用表, 在你的表里面再加一个字段,int level ,level这个字段意义就是相对于顶级分类,自己这条记录是属于第几级分类,
如:
总监 的level 是 0
副总监 的level 是 1
经理 的level是 2
.....
插入记录的时候,应该能够知道。父记录的level是多少,然后+1以后存进数据库。
这样子就楼主的问题就简单了,
1,所有总监以下的员工就是level非0的记录。
2,通过level可以分清楚员工的类型,
3,分页,还是通过limit 0,10 这种方法分。
手机码字,排版不方便,请自己慢慢看
$tmpRes[]?不清空的话这数组越来越大
<code>$result=array(); public function recuresion($res) { $tmpRes=array(); foreach ($res as $k => $v) { $result[k]=$v; $tmpRes[] = $this->obj->getResult($v['id']); //假设通过该方法获取副总监、经理、员工 } if (!empty($tmpRes)) { return $this->recuresion($tmpRes); } }</code>

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

PHP在电子商务、内容管理系统和API开发中广泛应用。1)电子商务:用于购物车功能和支付处理。2)内容管理系统:用于动态内容生成和用户管理。3)API开发:用于RESTfulAPI开发和API安全性。通过性能优化和最佳实践,PHP应用的效率和可维护性得以提升。

PHP仍然具有活力,其在现代编程领域中依然占据重要地位。1)PHP的简单易学和强大社区支持使其在Web开发中广泛应用;2)其灵活性和稳定性使其在处理Web表单、数据库操作和文件处理等方面表现出色;3)PHP不断进化和优化,适用于初学者和经验丰富的开发者。

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

PHP适合web开发,特别是在快速开发和处理动态内容方面表现出色,但不擅长数据科学和企业级应用。与Python相比,PHP在web开发中更具优势,但在数据科学领域不如Python;与Java相比,PHP在企业级应用中表现较差,但在web开发中更灵活;与JavaScript相比,PHP在后端开发中更简洁,但在前端开发中不如JavaScript。

PHP和Python各有优劣,选择取决于项目需求和个人偏好。1.PHP适合快速开发和维护大型Web应用。2.Python在数据科学和机器学习领域占据主导地位。
