微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP使用递归按层级查找数据代码详解

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

原理挺简单的,主要是通过父级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教程

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐