>백엔드 개발 >PHP 튜토리얼 >PHP Infinitus 분류 기능 구현 방법의 예에 대한 자세한 설명

PHP Infinitus 분류 기능 구현 방법의 예에 대한 자세한 설명

怪我咯
怪我咯원래의
2018-05-14 16:01:262832검색

본 글에서는 주로 PHP Infinitus 분류 기능의 구현 방법을 소개하고, PHP에서 Infinitus 분류 기능을 구현하기 위한 구체적인 아이디어, 구현 코드, 관련 주의사항을 예시 형태로 자세히 분석하여 도움이 필요한 친구들이 참고할 수 있습니다.

이 글의 예시에서는 PHP Infinitus 분류 함수의 구현 방법을 설명합니다. 다음과 같이 참고할 수 있도록 모든 사람과 공유하십시오.

프로그램을 개발할 때 때로는 모든 열(1차 열, 2차 열, 3차 열 등 포함)을 얻어야 하는 경우가 있습니다. 트리 구조를 형성합니다. 재귀 또는 참조를 사용할 수 있습니다(PHP의 참조는 C 또는 C++의 포인터와 유사합니다. 즉, 다른 말로 하면 됩니다).

참조를 통한 Infinitus 분류 구현

아이디어:

1. 즉, 처리할 모든 데이터를 첨자형 기본 키 ID로 패키징합니다. pk) pid를 사용하여 해당 상위 열을 쉽게 얻을 수 있도록 배열합니다.

2. 래핑된 데이터를 반복합니다. 루트 노드인 경우 해당 참조를 트리에 추가하고, 그렇지 않으면 해당 참조를 상위 클래스의 하위 요소에 추가합니다. 이러한 방식으로 루트 노드만 트리에 추가되더라도 각 루트 노드에 하위 요소가 있는 경우 하위 요소에 대한 참조가 포함됩니다. 그러므로 나무 모양을 이룰 수 있다.

코드는 다음과 같습니다

/**
 * 把返回的数据集转换成Tree
 * @param array $list 要转换的数据集
 * @param string $pk 自增字段(栏目id)
 * @param string $pid parent标记字段
 * @return array
 * @author dqs <1696232133@qq.com>
 */
function make_tree($list,$pk=&#39;id&#39;,$pid=&#39;pid&#39;,$child=&#39;_child&#39;,$root=0){
  $tree=array();
  $packData=array();
  foreach ($list as $data) {
    $packData[$data[$pk]] = $data;
  }
  foreach ($packData as $key =>$val){
    if($val[$pid]==$root){//代表跟节点
      $tree[]=& $packData[$key];
    }else{
      //找到其父类
      $packData[$val[$pid]][$child][]=& $packData[$key];
    }
  }
  return $tree;
}

데이터 구조는 다음과 같습니다.

실행 결과는 다음과 같습니다

Array
(
  [0] => Array
    (
      [id] => 6
      [pid] => 0
      [title] => 测试1
      [url] => test1
      [sort] => 0
      [create_time] => 1464076199
      [update_time] => 1464076199
      [status] => 1
      [target] => 0
    )
  [1] => Array
    (
      [id] => 7
      [pid] => 0
      [title] => 测试2
      [url] => test2
      [sort] => 0
      [create_time] => 1464076218
      [update_time] => 1464076218
      [status] => 1
      [target] => 0
    )
  [2] => Array
    (
      [id] => 1
      [pid] => 0
      [title] => 首页
      [url] => Index/index
      [sort] => 1
      [create_time] => 1379475111
      [update_time] => 1379923177
      [status] => 1
      [target] => 0
    )
  [3] => Array
    (
      [id] => 2
      [pid] => 0
      [title] => 博客
      [url] => Article/index?category=blog
      [sort] => 2
      [create_time] => 1379475131
      [update_time] => 1379483713
      [status] => 1
      [target] => 0
      [_child] => Array
        (
          [0] => Array
            (
              [id] => 4
              [pid] => 2
              [title] => 个人博客
              [url] => ownblog
              [sort] => 0
              [create_time] => 1464075558
              [update_time] => 1464075558
              [status] => 1
              [target] => 0
              [_child] => Array
                (
                  [0] => Array
                    (
                      [id] => 8
                      [pid] => 4
                      [title] => 新浪博客
                      [url] => sinaBlog
                      [sort] => 0
                      [create_time] => 1464077276
                      [update_time] => 1464077276
                      [status] => 1
                      [target] => 0
                    )
                )
            )
          [1] => Array
            (
              [id] => 5
              [pid] => 2
              [title] => 他人博客
              [url] => otherBlog
              [sort] => 0
              [create_time] => 1464075582
              [update_time] => 1464075582
              [status] => 1
              [target] => 0
            )
        )
    )
  [4] => Array
    (
      [id] => 3
      [pid] => 0
      [title] => 官网
      [url] => http://www.onethink.cn
      [sort] => 3
      [create_time] => 1379475154
      [update_time] => 1387163458
      [status] => 1
      [target] => 0
    )
)

첨부된 OneThink Infinitus 분류 기능에서

/**
 * 把返回的数据集转换成Tree
 * @param array $list 要转换的数据集
 * @param string $pid parent标记字段
 * @param string $level level标记字段
 * @return array
 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
 */
function list_to_tree($list, $pk=&#39;id&#39;, $pid = &#39;pid&#39;, $child = &#39;_child&#39;, $root = 0) {
  // 创建Tree
  $tree = array();
  if(is_array($list)) {
    // 创建基于主键的数组引用
    $refer = array();
    foreach ($list as $key => $data) {
      $refer[$data[$pk]] =& $list[$key];
    }
    foreach ($list as $key => $data) {
      // 判断是否存在parent
      $parentId = $data[$pid];
      if ($root == $parentId) {
        $tree[] =& $list[$key];
      }else{
        if (isset($refer[$parentId])) {
          $parent =& $refer[$parentId];
          $parent[$child][] =& $list[$key];
        }
      }
    }
  }
  return $tree;
}

Infinitus 분류를 재귀적으로 구현

아이디어:

1. 모든 루트 노드를 얻기 위해 루프를 돌립니다.

2. 각 노드를 얻을 때 원본 데이터에서 해당 노드를 제거하고 원본 데이터가 빌 때까지 모든 하위 노드를 재귀적으로 얻습니다.

코드는 다음과 같이 구현됩니다.

function make_tree1($list,$pk=&#39;id&#39;,$pid=&#39;pid&#39;,$child=&#39;_child&#39;,$root=0){
  $tree=array();
  foreach($list as $key=> $val){
    if($val[$pid]==$root){
      //获取当前$pid所有子类
        unset($list[$key]);
        if(! empty($list)){
          $child=make_tree1($list,$pk,$pid,$child,$val[$pk]);
          if(!empty($child)){
            $val[&#39;_child&#39;]=$child;
          }
        }
        $tree[]=$val;
    }
  }
  return $tree;
}

효과 스크린샷은 다음과 같습니다.

위 내용은 PHP Infinitus 분류 기능 구현 방법의 예에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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