今天主要介绍一下使用递归来按层级查找数据。

原理挺简单的,主要是通过父级id一级一级的循环查找子级,使用PHP循环代码也很容易实现,不过如果层级越多,PHP重复代码也越多,这时可以使用递归来实现这功能。

1、首先查出要使用的数据组成一个数组(避免递归里查询数据库,之后根据这个数组组成自己需要的数据就可以了)

比如得到如下数据:

$data = [    ['id' => '1', 'pid' => '0', 'dsp' => '1'],    ['id' => '2', 'pid' => '0', 'dsp' => '2'],    ['id' => '3', 'pid' => '0', 'dsp' => '3'],    ['id' => '4', 'pid' => '1', 'dsp' => '1-4'],    ['id' => '5', 'pid' => '4', 'dsp' => '1-4-5'],    ['id' => '6', 'pid' => '5', 'dsp' => '1-4-5-6'],    ['id' => '7', 'pid' => '3', 'dsp' => '3-7'],    ['id' => '8', 'pid' => '2', 'dsp' => '2-8'],    ['id' => '9', 'pid' => '1', 'dsp' => '1-9'],    ['id' => '10', 'pid' => '4', 'dsp' => '1-4-10'],];

2、接下来使用递归重组数据,使数据按层级显示。

/** * 根据父级id查找子级数据 * @param $data     要查询的数据 * @param int $pid 父级id */public function recursion($data, $pid = 0){    static $child = [];   // 定义存储子级数据数组    foreach ($data as $key => $value) {        if ($value['pid'] == $pid) {            $child[] = $value;   // 满足条件的数据添加进child数组            unset($data[$key]);  // 使用过后可以销毁            $this->recursion($data, $value['id']);   // 递归调用,查找当前数据的子级        }    }    return $child;}

得到结果:

[  {    "id": "1",    "pid": "0",    "dsp": "1"  },  {    "id": "4",    "pid": "1",    "dsp": "1-4"  },  {    "id": "5",    "pid": "4",    "dsp": "1-4-5"  },  {    "id": "6",    "pid": "5",    "dsp": "1-4-5-6"  },  {    "id": "10",    "pid": "4",    "dsp": "1-4-10"  },  {    "id": "9",    "pid": "1",    "dsp": "1-9"  },  {    "id": "2",    "pid": "0",    "dsp": "2"  },  {    "id": "8",    "pid": "2",    "dsp": "2-8"  },  {    "id": "3",    "pid": "0",    "dsp": "3"  },  {    "id": "7",    "pid": "3",    "dsp": "3-7"  }]

3、还可以使用下面的方法,显示更有层次感。

/** * 根据父级id查找子级数据 * @param $data     要查询的数据 * @param int $pid 父级id */public function recursion($data, $pid = 0){    $child = [];   // 定义存储子级数据数组    foreach ($data as $key => $value) {        if ($value['pid'] == $pid) {            unset($data[$key]);  // 使用过后可以销毁            $value['child'] = $this->recursion($data, $value['id']);   // 递归调用,查找当前数据的子级            $child[] = $value;   // 把子级数据添加进数组        }    }    return $child;}

得到结果:

[  {    "id": "1",    "pid": "0",    "dsp": "1",    "child": [      {        "id": "4",        "pid": "1",        "dsp": "1-4",        "child": [          {            "id": "5",            "pid": "4",            "dsp": "1-4-5",            "child": [              {                "id": "6",                "pid": "5",                "dsp": "1-4-5-6",                "child": []              }            ]          },          {            "id": "10",            "pid": "4",            "dsp": "1-4-10",            "child": []          }        ]      },      {        "id": "9",        "pid": "1",        "dsp": "1-9",        "child": []      }    ]  },  {    "id": "2",    "pid": "0",    "dsp": "2",    "child": [      {        "id": "8",        "pid": "2",        "dsp": "2-8",        "child": []      }    ]  },  {    "id": "3",    "pid": "0",    "dsp": "3",    "child": [      {        "id": "7",        "pid": "3",        "dsp": "3-7",        "child": []      }    ]  }]

更多相关php知识,请访问php教程!

更多相关文章

  1. php实现向mysql批量插入数据
  2. php在mysql里批量插入数据(代码实例)
  3. PHP脚本导出MySQL数据字典(代码示例)
  4. 关于PHP+jQuery-ui拖动浮动层排序并保存到数据库实例
  5. 浅谈PHP连接MySQL数据库的三种方式
  6. PHP数据库框架Medoo1.6安装教程
  7. PHP面向对象之3种数据访问方式详解(代码实例)
  8. PHP中如何使用PDO修改数据?
  9. PHP递归算法的应用(含示例)

随机推荐

  1. 非常简单的js双向绑定框架(一)
  2. HTML Select字段通过ajax调用Web服务
  3. jQuery - 获取具有特定类的已选中复选框
  4. NodeJS - 解析JSON(只有字符串或数字)
  5. Javascript等待函数的结束,包括node.js的
  6. 如何从json对象获取匹配元素的索引?
  7. JavaScript循环输入创建一个对象数组
  8. 彻底解决IE8和IE9下ewebeditor上按钮无效
  9. 如何在JavaScript中对字符串排序
  10. 有没有办法检查两个数组是否具有相同的元