欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  神坛PHP

PHP使用递归按层级查找数据

程序员文章站 2021-12-30 07:14:21
...

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": []

      }

    ]

  }

]