[关闭]
@Chiang 2019-12-25T12:30:12.000000Z 字数 2391 阅读 563

递归

PHP


什么是递归

概念: 程序调用自己的编程技巧称为递归.一个过程函数在其定义或说明中有直接或间接调用自身的一种方法。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的大型重复计算,大大地减少了程序的代码量。

递归的两个条件

  • 递归出口(终止递归的条件)
  • 递归表达式(规律)

循环与递归

循环是执行一段代码,仅仅参数不同。递归要调用自己。也就相当于循环就像在一个地方打转,而递归是一层一层进入,再按原路返回,虽然每一层都一样(参数逐渐再缩小)
循环都可以改写成递归,但有的递归不能改写成循环。

无限级分类

无level层级

  1. <?php
  2. $arr = array(
  3. array('id'=>1,'name'=>'电脑','pid'=>0),
  4. array('id'=>2,'name'=>'手机','pid'=>0),
  5. array('id'=>3,'name'=>'笔记本','pid'=>1),
  6. array('id'=>4,'name'=>'台式机','pid'=>1),
  7. array('id'=>5,'name'=>'智能机','pid'=>2),
  8. array('id'=>6,'name'=>'功能机','pid'=>2),
  9. array('id'=>7,'name'=>'超级本','pid'=>3),
  10. array('id'=>8,'name'=>'游戏本','pid'=>3),
  11. );
  12. function getTree($data,$pid){
  13. $list = array();
  14. foreach($data as $key => $value){
  15. if($value['pid'] == $pid){
  16. $value['son'] = getTree($data,$value['id']);
  17. $list[] = $value;
  18. }
  19. }
  20. return $list;
  21. }
  22. $a = getTree($arr,0);
  23. echo "<pre/>";
  24. var_dump($a);exit;

输出结果:

  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [id] => 1
  6. [name] => 电脑
  7. [pid] => 0
  8. [son] => Array
  9. (
  10. [0] => Array
  11. (
  12. [id] => 3
  13. [name] => 笔记本
  14. [pid] => 1
  15. [son] => Array
  16. (
  17. [0] => Array
  18. (
  19. [id] => 7
  20. [name] => 超级本
  21. [pid] => 3
  22. [son] => Array
  23. (
  24. )
  25. )
  26. [1] => Array
  27. (
  28. [id] => 8
  29. [name] => 游戏本
  30. [pid] => 3
  31. [son] => Array
  32. (
  33. )
  34. )
  35. )
  36. )
  37. [1] => Array
  38. (
  39. [id] => 4
  40. [name] => 台式机
  41. [pid] => 1
  42. [son] => Array
  43. (
  44. )
  45. )
  46. )
  47. )
  48. [1] => Array
  49. (
  50. [id] => 2
  51. [name] => 手机
  52. [pid] => 0
  53. [son] => Array
  54. (
  55. [0] => Array
  56. (
  57. [id] => 5
  58. [name] => 智能机
  59. [pid] => 2
  60. [son] => Array
  61. (
  62. )
  63. )
  64. [1] => Array
  65. (
  66. [id] => 6
  67. [name] => 功能机
  68. [pid] => 2
  69. [son] => Array
  70. (
  71. )
  72. )
  73. )
  74. )
  75. )

有level层级

  1. <?php
  2. $arr = array(
  3. array('id'=>1,'name'=>'电脑','pid'=>0),
  4. array('id'=>2,'name'=>'手机','pid'=>0),
  5. array('id'=>3,'name'=>'笔记本','pid'=>1),
  6. array('id'=>4,'name'=>'台式机','pid'=>1),
  7. array('id'=>5,'name'=>'智能机','pid'=>2),
  8. array('id'=>6,'name'=>'功能机','pid'=>2),
  9. array('id'=>7,'name'=>'超级本','pid'=>3),
  10. array('id'=>8,'name'=>'游戏本','pid'=>3),
  11. );
  12. function getTree($data,$pid,$level){
  13. $list = array();
  14. foreach($data as $key => $value){
  15. if($value['pid'] == $pid){
  16. $value['level'] = $level;
  17. $value['son'] = getTree($data,$value['id'],$level+1);
  18. $list[] = $value;
  19. }
  20. }
  21. return $list;
  22. }
  23. $a = getTree($arr,0,0);
  24. echo "<pre/>";
  25. var_dump($a);exit;

输出结果:

  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [id] => 1
  6. [name] => 电脑
  7. [pid] => 0
  8. [level] => 0
  9. [son] => Array
  10. (
  11. [0] => Array
  12. (
  13. [id] => 3
  14. [name] => 笔记本
  15. [pid] => 1
  16. [level] => 1
  17. [son] => Array
  18. (
  19. [0] => Array
  20. (
  21. [id] => 7
  22. [name] => 超级本
  23. [pid] => 3
  24. [level] => 2
  25. [son] => Array
  26. (
  27. )
  28. )
  29. [1] => Array
  30. (
  31. [id] => 8
  32. [name] => 游戏本
  33. [pid] => 3
  34. [level] => 2
  35. [son] => Array
  36. (
  37. )
  38. )
  39. )
  40. )
  41. [1] => Array
  42. (
  43. [id] => 4
  44. [name] => 台式机
  45. [pid] => 1
  46. [level] => 1
  47. [son] => Array
  48. (
  49. )
  50. )
  51. )
  52. )
  53. [1] => Array
  54. (
  55. [id] => 2
  56. [name] => 手机
  57. [pid] => 0
  58. [level] => 0
  59. [son] => Array
  60. (
  61. [0] => Array
  62. (
  63. [id] => 5
  64. [name] => 智能机
  65. [pid] => 2
  66. [level] => 1
  67. [son] => Array
  68. (
  69. )
  70. )
  71. [1] => Array
  72. (
  73. [id] => 6
  74. [name] => 功能机
  75. [pid] => 2
  76. [level] => 1
  77. [son] => Array
  78. (
  79. )
  80. )
  81. )
  82. )
  83. )

参考资料:
递归

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注