오랜 시간 동안 PHP를 사용하면서 백엔드 관리 시스템의 필수 애플리케이션 모듈은 열 분류라는 사실을 알게 되었습니다. 일반적으로 열은 무한 수준으로 만들어야 하며, 이는 이론적으로 각 열이 추가될 수 있음을 의미합니다. 하위 구성 요소. 내 생각에는 이 상황을 처리하는 것이 전체적으로 그리 복잡하지는 않습니다. 유일하게 상대적으로 어려운 점은 무한 열에 대한 쿼리입니다.
이런 상황에 대해 간단히 소개하자면, 이런 종류의 무한 열을 쿼리하는 방법에는 일반적으로 두 가지가 있습니다. 그 중 하나는 스택 메커니즘을 사용하는 것이고, 다른 하나는 재귀 함수를 사용하는 것입니다. 물론 재귀 함수 구현 메커니즘도 스택의 도움으로 구현됩니다. 아래에서는 이 두 가지 방법을 별도로 소개하겠습니다.
재귀함수 구현
위에서 언급한 것처럼 재귀 함수도 스택 메커니즘의 도움으로 구현되지만 기본 스택 처리는 애플리케이션의 구현 논리에만 관심이 있는 프로그래머에게 투명합니다. 따라서 위의 문제를 처리하기 위해 재귀를 사용하는 것이 이해하기 쉽고 코드가 비교적 간결합니다.
재귀함수를 사용하기 때문에 이름에서 알 수 있듯이 맞춤 함수를 사용해야 합니다. 먼저 구현 아이디어에 대해 간략히 말씀드리고, 구체적인 내용은 코드에 반영하도록 하겠습니다.
각 레이어 함수의 주요 작업은 상위 ID가 현재 ID인 열을 찾는 것입니다. 찾은 후 자체 함수를 다시 호출하고 찾은 열의 ID를 다음 레이어의 상위 ID로 사용합니다.
흐름도는 다음과 같습니다
사진 1
위의 설명이 이해가 되실지는 모르겠지만, 아래 코드를 보시면 됩니다.
<?php /** * 个人博客:迹忆博客 * 博客地址:www.onmpw.com * 递归实现无限极分类 */ $channels = array( array('id'=>1,'name'=>"衣服",'parId'=>0), array('id'=>2,'name'=>"书籍",'parId'=>0), array('id'=>3,'name'=>"T恤",'parId'=>1), array('id'=>4,'name'=>"裤子",'parId'=>1), array('id'=>5,'name'=>"鞋子",'parId'=>1), array('id'=>6,'name'=>"皮鞋",'parId'=>5), array('id'=>7,'name'=>"运动鞋",'parId'=>5), array('id'=>8,'name'=>"耐克",'parId'=>7), array('id'=>9,'name'=>"耐克",'parId'=>3), array('id'=>10,'name'=>"鸿星尔克",'parId'=>7), array('id'=>11,'name'=>"小说",'parId'=>2), array('id'=>12,'name'=>"科幻小说",'parId'=>11), array('id'=>13,'name'=>"古典名著",'parId'=>11), array('id'=>14,'name'=>"文学",'parId'=>2), array('id'=>15,'name'=>"四书五经",'parId'=>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]['parId'] == $parid){ $html[] = array('id'=>$channels[$i]['id'],'name'=>$channels[$i]['name'],'dep'=>$dep); getChild($html,$channels[$i]['id'],$channels,$dep+1); } } } getChild($html,0,$channels,1); ?>
무한 컬럼 쿼리를 재귀적으로 구현하기 위한 핵심 코드입니다. 그림 1을 기반으로 구현 프로세스를 보다 명확하게 이해해야 합니다.
비재귀적, 즉 스택 메커니즘을 사용하여 무한 열 쿼리 구현
위에서는 무한 열 쿼리를 위한 재귀 사용에 대해 간략하게 소개했습니다. 아래에서는 비재귀적 방법을 간략하게 소개합니다. 재귀 함수를 사용하지 않지만 무한 컬럼의 구조 페이지를 고려하여 이 문제를 해결하려면 재귀 구현 메커니즘, 즉 스택 메커니즘을 참조할 필요가 있습니다.
제가 학교에 다닐 때 선생님께서 스택의 핵심 메커니즘은 실제로 선입, 후출이라는 네 단어에 불과하다고 말씀하셨습니다.
여기에서는 스택의 메커니즘에 대해 많이 이야기하지 않지만 주로 스택을 사용하여 무제한 열 쿼리를 구현하는 방법에 대해 이야기하겠습니다.
1. 먼저 상단 열을 스택에 밀어 넣습니다.
2. 스택에서 최상위 요소를 팝합니다
3. 팝된 요소를 배열에 저장하고 깊이를 표시합니다. (깊이는 상위 열의 깊이에 1을 더하는 것입니다.)
4. 팝된 요소를 상위 열로 사용하고 해당 하위 열을 찾습니다.
5. 발견된 하위 열을 스택에 푸시하고 2단계를 반복합니다
6. 스택이 비어 있다고 판단되면 프로세스가 종료됩니다.
위 단계를 번역하면 이 단계를 PHP 코드로 변환할 수 있습니다.
<?php /** * 个人博客:迹忆博客 * 博客地址:www.onmpw.com *使用非递归,即使用栈的方式实现栏目的无限极分类查询 */ $channels = array( array('id'=>1,'name'=>"衣服",'parId'=>0), array('id'=>2,'name'=>"书籍",'parId'=>0), array('id'=>3,'name'=>"T恤",'parId'=>1), array('id'=>4,'name'=>"裤子",'parId'=>1), array('id'=>5,'name'=>"鞋子",'parId'=>1), array('id'=>6,'name'=>"皮鞋",'parId'=>5), array('id'=>7,'name'=>"运动鞋",'parId'=>5), array('id'=>8,'name'=>"耐克",'parId'=>7), array('id'=>9,'name'=>"耐克",'parId'=>3), array('id'=>10,'name'=>"鸿星尔克",'parId'=>7), array('id'=>11,'name'=>"小说",'parId'=>2), array('id'=>12,'name'=>"科幻小说",'parId'=>11), array('id'=>13,'name'=>"古典名著",'parId'=>11), array('id'=>14,'name'=>"文学",'parId'=>2), array('id'=>15,'name'=>"四书五经",'parId'=>14) ); $stack = array(); //定义一个空栈 $html = array(); //用来保存各个栏目之间的关系以及该栏目的深度 /* * 自定义入栈函数 */ function pushStack(&$stack,$channel,$dep){ array_push($stack, array('channel'=>$channel,'dep'=>$dep)); } /* * 自定义出栈函数 */ function popStack(&$stack){ return array_pop($stack); } /* * 首先将顶级栏目压入栈中 */ foreach($channels as $key=>$val){ if($val['parId'] == 0) pushStack($stack,$val,0); } /* * 将栈中的元素出栈,查找其子栏目 */ do{ $par = popStack($stack); //将栈顶元素出栈 /* * 查找以此栏目为父级栏目的id,将这些栏目入栈 */ for($i=0;$i<count($channels);$i++){ if($channels[$i]['parId'] == $par['channel']['id']){ pushStack($stack,$channels[$i],$par['dep']+1); } } /* * 将出栈的栏目以及该栏目的深度保存到数组中 */ $html[] = array('id'=>$par['channel']['id'],'name'=>$par['channel']['name'],'dep'=>$par['dep']); }while(count($stack)>0);
위의 내용은 비재귀적 방법을 사용하여 구현되었습니다.
코드 다운로드: https://github.com/onmpw/phpApp
요약
위의 두 가지 방법에는 각각의 장점과 단점이 있습니다. 비록 구현 형식은 다르지만 무한 열의 구조를 고려하면 둘 다 구현 메커니즘은 동일합니다. 둘 다 스택을 사용하여 구현됩니다. 실제 상황에서는 실제 상황의 필요에 따라 이를 구현할 수 있는 방법을 선택해야 합니다.