>  기사  >  백엔드 개발  >  PHP를 사용하여 무제한 분류 쿼리 구현

PHP를 사용하여 무제한 분류 쿼리 구현

不言
不言원래의
2018-06-08 17:28:321597검색

이 글은 재귀가 있는 경우와 없는 경우로 나누어서 PHP에서 무한 분류를 구현하는 방법을 소개합니다. 관심 있는 친구들은 참고하시기 바랍니다.

PHP를 오랫동안 사용하다 보니 백엔드 관리 시스템이 필수라는 것을 알게 되었습니다. 애플리케이션 모듈은 열을 분류하는 것입니다. 일반적으로 열은 무한 수준으로 이루어져야 합니다. 이는 이론적으로 각 열에 하위 열을 추가할 수 있음을 의미합니다. 내 생각에는 이 상황을 처리하는 것이 전체적으로 그리 복잡하지는 않습니다. 유일하게 상대적으로 어려운 점은 무한 열에 대한 쿼리입니다.

이런 상황에 대해 간단히 소개하겠습니다. 이런 무한 열을 쿼리하는 방법에는 일반적으로 두 가지가 있습니다. 그 중 하나는 스택 메커니즘을 사용하는 것이고, 다른 하나는 재귀 함수를 사용하는 것입니다. 재귀 함수 구현 메커니즘도 스택의 도움으로 구현됩니다. 아래에서는 이 두 가지 방법을 별도로 소개하겠습니다.

재귀 함수를 구현하는 방법

위에서 언급했듯이 재귀 함수도 스택 메커니즘의 도움으로 구현되지만 기본 스택 처리는 애플리케이션 로직의 구현에만 관심이 있는 프로그래머에게 투명합니다. . 따라서 위의 문제를 처리하기 위해 재귀를 사용하는 것이 이해하기 쉽고 코드가 비교적 간결합니다.

재귀함수를 사용하고 있기 때문에 이름에서 알 수 있듯이 맞춤 함수를 사용해야 합니다. 먼저 구현 아이디어에 대해 간략히 말씀드리고, 구체적인 내용은 코드에 반영하도록 하겠습니다.

각 레이어 함수의 주요 작업은 상위 ID가 현재 ID인 열을 찾는 것입니다. 찾은 후 자체 함수를 다시 호출하고 찾은 열의 ID를 다음 레이어의 상위 ID로 사용합니다.

흐름도는 다음과 같습니다

그림 1

위의 설명이 이해가 되실지는 모르겠지만 바로 아래 코드를 보시면 됩니다

<?php
/**
 * 个人博客:迹忆博客
 * 博客地址:www.onmpw.com
 * 递归实现无限极分类
 */
$channels = array(
  array(&#39;id&#39;=>1,&#39;name&#39;=>"衣服",&#39;parId&#39;=>0),
  array(&#39;id&#39;=>2,&#39;name&#39;=>"书籍",&#39;parId&#39;=>0),
  array(&#39;id&#39;=>3,&#39;name&#39;=>"T恤",&#39;parId&#39;=>1),
  array(&#39;id&#39;=>4,&#39;name&#39;=>"裤子",&#39;parId&#39;=>1),
  array(&#39;id&#39;=>5,&#39;name&#39;=>"鞋子",&#39;parId&#39;=>1),
  array(&#39;id&#39;=>6,&#39;name&#39;=>"皮鞋",&#39;parId&#39;=>5),
  array(&#39;id&#39;=>7,&#39;name&#39;=>"运动鞋",&#39;parId&#39;=>5),
  array(&#39;id&#39;=>8,&#39;name&#39;=>"耐克",&#39;parId&#39;=>7),
  array(&#39;id&#39;=>9,&#39;name&#39;=>"耐克",&#39;parId&#39;=>3),
  array(&#39;id&#39;=>10,&#39;name&#39;=>"鸿星尔克",&#39;parId&#39;=>7),
  array(&#39;id&#39;=>11,&#39;name&#39;=>"小说",&#39;parId&#39;=>2),
  array(&#39;id&#39;=>12,&#39;name&#39;=>"科幻小说",&#39;parId&#39;=>11),
  array(&#39;id&#39;=>13,&#39;name&#39;=>"古典名著",&#39;parId&#39;=>11),
  array(&#39;id&#39;=>14,&#39;name&#39;=>"文学",&#39;parId&#39;=>2),
  array(&#39;id&#39;=>15,&#39;name&#39;=>"四书五经",&#39;parId&#39;=>14)
);
$html = array();
/**
 * 递归查找父id为$parid的结点
 * @param array $html  按照父-》子的结构存放查找出来的结点
 * @param int $parid  指定的父id
 * @param array $channels  数据数组
 * @param int $dep  遍历的深度,初始化为1
 */
function getChild(&$html,$parid,$channels,$dep){
  /*
   * 遍历数据,查找parId为参数$parid指定的id
   */
  for($i = 0;$i<count($channels);$i++){
    if($channels[$i][&#39;parId&#39;] == $parid){
      $html[] = array(&#39;id&#39;=>$channels[$i][&#39;id&#39;],&#39;name&#39;=>$channels[$i][&#39;name&#39;],&#39;dep&#39;=>$dep);
      getChild($html,$channels[$i][&#39;id&#39;],$channels,$dep+1);
    }
  }
}
getChild($html,0,$channels,1);
?>

이것은 무한 컬럼 쿼리 코드를 재귀적으로 구현하는 핵심이며 그림 1과 결합하여 구현 프로세스를 보다 명확하게 이해해야 합니다.

비재귀적, 즉 스택 메커니즘을 사용하여 무한 수준 열 쿼리를 구현합니다

위에서 무한 수준 열 쿼리를 구현하기 위해 재귀를 사용하는 방법을 간략하게 소개했습니다. 방법. 재귀 함수를 사용하지 않지만 무한 컬럼의 구조 페이지를 고려하여 이 문제를 해결하려면 재귀 구현 메커니즘, 즉 스택 메커니즘을 참조할 필요가 있습니다.

제가 학교에 다닐 때 선생님께서 스택의 핵심 메커니즘은 실제로 선입, 후출이라는 네 단어에 불과하다고 말씀하셨습니다.

여기에서는 스택의 메커니즘에 대해 많이 이야기하지 않지만 주로 스택을 사용하여 무제한 열 쿼리를 구현하는 방법에 대해 설명하겠습니다.

1. 먼저 상단 열을 스택에 밀어넣습니다

2. 스택에서 상단 요소를 팝합니다

3. 팝된 요소를 배열에 저장하고 깊이를 표시합니다(깊이는 상위 열의 깊이에 1을 더한 값입니다). )

4. 팝된 요소를 상위 열로 사용하고 해당 하위 열을 검색합니다.

5. 발견된 하위 열을 스택에 푸시하고 스택이 비어 있다고 판단되면 2단계를 반복합니다. 프로세스가 종료됩니다.

위 단계를 변환하면 이러한 단계를 PHP 코드로 변환할 수 있습니다. 핵심 코드는 다음과 같습니다


<?php
/**
 * 个人博客:迹忆博客
 * 博客地址:www.onmpw.com
*使用非递归,即使用栈的方式实现栏目的无限极分类查询
*/
$channels = array(
  array(&#39;id&#39;=>1,&#39;name&#39;=>"衣服",&#39;parId&#39;=>0),
  array(&#39;id&#39;=>2,&#39;name&#39;=>"书籍",&#39;parId&#39;=>0),
  array(&#39;id&#39;=>3,&#39;name&#39;=>"T恤",&#39;parId&#39;=>1),
  array(&#39;id&#39;=>4,&#39;name&#39;=>"裤子",&#39;parId&#39;=>1),
  array(&#39;id&#39;=>5,&#39;name&#39;=>"鞋子",&#39;parId&#39;=>1),
  array(&#39;id&#39;=>6,&#39;name&#39;=>"皮鞋",&#39;parId&#39;=>5),
  array(&#39;id&#39;=>7,&#39;name&#39;=>"运动鞋",&#39;parId&#39;=>5),
  array(&#39;id&#39;=>8,&#39;name&#39;=>"耐克",&#39;parId&#39;=>7),
  array(&#39;id&#39;=>9,&#39;name&#39;=>"耐克",&#39;parId&#39;=>3),
  array(&#39;id&#39;=>10,&#39;name&#39;=>"鸿星尔克",&#39;parId&#39;=>7),
  array(&#39;id&#39;=>11,&#39;name&#39;=>"小说",&#39;parId&#39;=>2),
  array(&#39;id&#39;=>12,&#39;name&#39;=>"科幻小说",&#39;parId&#39;=>11),
  array(&#39;id&#39;=>13,&#39;name&#39;=>"古典名著",&#39;parId&#39;=>11),
  array(&#39;id&#39;=>14,&#39;name&#39;=>"文学",&#39;parId&#39;=>2),
  array(&#39;id&#39;=>15,&#39;name&#39;=>"四书五经",&#39;parId&#39;=>14)
);
$stack = array(); //定义一个空栈
$html = array();  //用来保存各个栏目之间的关系以及该栏目的深度
/*
 * 自定义入栈函数
 */
function pushStack(&$stack,$channel,$dep){
  array_push($stack, array(&#39;channel&#39;=>$channel,&#39;dep&#39;=>$dep));
}
/*
 * 自定义出栈函数
 */
function popStack(&$stack){
  return array_pop($stack);
}
/*
 * 首先将顶级栏目压入栈中
 */
foreach($channels as $key=>$val){
  if($val[&#39;parId&#39;] == 0)
    pushStack($stack,$val,0);
}
/*
 * 将栈中的元素出栈,查找其子栏目
 */
do{
  $par = popStack($stack); //将栈顶元素出栈
  /*
   * 查找以此栏目为父级栏目的id,将这些栏目入栈
   */
  for($i=0;$i<count($channels);$i++){
    if($channels[$i][&#39;parId&#39;] == $par[&#39;channel&#39;][&#39;id&#39;]){
      pushStack($stack,$channels[$i],$par[&#39;dep&#39;]+1);
    }
  }
  /*
   * 将出栈的栏目以及该栏目的深度保存到数组中
   */
  $html[] = array(&#39;id&#39;=>$par[&#39;channel&#39;][&#39;id&#39;],&#39;name&#39;=>$par[&#39;channel&#39;][&#39;name&#39;],&#39;dep&#39;=>$par[&#39;dep&#39;]);
}while(count($stack)>0);

위는 비재귀적인 방식으로 구현됩니다.

위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되었으면 좋겠습니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요!

관련 추천:

php


로 무제한 트리 메뉴 만들기

위 내용은 PHP를 사용하여 무제한 분류 쿼리 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.