>백엔드 개발 >PHP 튜토리얼 >php_php 기술로 구현된 트리 구조 데이터 액세스 클래스의 예

php_php 기술로 구현된 트리 구조 데이터 액세스 클래스의 예

WBOY
WBOY원래의
2016-05-16 20:29:44971검색

이 기사의 예에서는 PHP로 구현된 트리 구조 데이터 액세스 클래스를 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요.

구체적인 구현 코드는 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.
/**
 * Tanphp 프레임워크
 *
 *
 * @category   Tanphp
 * @package    데이터_구조
 * @version    $Id: Tree.php 25024 2012-11-26 22:22:22 tanbo $
 */

/**
* 트리 구조 데이터 접근 클래스
*
* 트리 구조 데이터에 빠르게 접근하기 위해 사용됩니다
*
* @param array $arr 매개변수는
예시와 같이 인덱스 필드(id)와 트리 구조를 나타내는 필드(path)를 포함하는 표준 2차원 배열이어야 합니다. *
* @예제 <코드> * $arr = 배열(
* array( 'id' => 1, 'name' => 'php', 'path' => '1' ),
* array( 'id' => 3, 'name' => 'php1', 'path' => '1-3' ),
* array( 'id' => 2, 'name' => 'mysql', 'path' => '2' ),
* array( 'id' => 6, 'name' => 'mysql1', 'path' => '2-6' ),
* array( 'id' => 7, 'name' => 'mysql2', 'path' => '2-7' ),
* array( 'id' => 5, 'name' => 'php11', 'path' => '1-3-5' ),
* array( 'id' => 4, 'name' => 'php2', 'path' => '1-4' ),
* ); * $cate = 새 트리($arr)
*
* $data = $cate->getChild(2)
*
* print_r($data->toArray())
* *
​*/
클래스 트리
{
공개 $_info; //노드 정보
공개 $_child = array(); //하위 노드
private $_parent; //부모 노드
private $_data; //현재 작업에 대한 임시 데이터
Private static $_indexs = array(); //모든 노드의 인덱스
Private static $_index_key = 'id' //인덱스 키
Private static $_tree_key = 'path'; //트리 구조 표현식 키
Private static $_tree_delimiter = '-' //속성 구조 표현식 구분 기호
​  
/**
* 생성자
* *
* @param 배열 $arr
* @param boole $force_sort true인 경우 $arr가 강제로 정렬됩니다.
* @return 무효
​​*/
공용 함수 __construct(array $arr = array(), $force_sort=true)
{
If ($force_sort === true) {
$arr=$this->_array_sort($arr, self::$_tree_key)
           }
If (!emptyempty($arr)) {
                  $this->_init($arr)
           }
}
​  
/**
* 트리 데이터의 초기 저장
* *
* @param 배열 $arr
* @return 무효
​​*/
개인 함수 _init(array $arr)
{
foreach($arr를 $item으로) {
>                                            > >                $count_paths = 개수($paths)
$parent_id = isset($paths[$count_paths-2]) ? $paths[$count_paths-2] : NULL
~ if ( $count_paths>1 ~ >                                           ​  >                                                                                                      && 인스턴스 트리                          ) {
>                 } elseif ($count_paths == 1) {
$this->addChild($item)
                } else {
                     새로운 예외 발생("path data error".var_export($item, true))
               }
           }
                                    
​​​​ //print_r(self::$_indexs)
}
​  
/**
* 하위 노드 추가
* *
* @param 배열 $item
* @return 무효
​​*/
공개 함수 addChild(배열 $item, $parent = NULL)
{
$child = 새 트리()
$child->_info = $항목
$child->_parent = $parent == NULL $this : $parent
$child->_parent->_child[] = $child
                                    
            $this->_addIndex($item, $child->_getSelf())
}
​  
/**
* 색인에 노드 추가
* *
* @param 배열 $item
* @param mix $value
* @return 무효
​​*/
전용 함수 _addIndex(array $item, $value)
{
If (array_key_exists(self::$_index_key, $item) && is_int($item[self::$_index_key])) {
                 self::$_indexs[$item[self::$_index_key]] = $value
         } else {
                 새로운 예외 발생("ID 필드가 존재하지 않거나 문자열이 아닙니다.");            }
}
​  
/**
* 자신에 대한 참조를 얻으세요
* *
* @return 트리 객체 인용문
​​*/
비공개 함수 _getSelf()
{
          $this 반환
}
​  
/**
* * 지정된 ID를 가진 노드의 하위 노드를 가져옵니다.
* *
* @param int $id
* @return 트리 객체
​​*/
공개 함수 getChild($id)
{
        $data       = self::$_indexs[$id]->_child;
        $this->_data = $data;
        $this를 반환합니다.
    }
    
    /**
* * 지정된 ID를 가진 노드의 상위 노드를 가져옵니다.
* *
* @param int $id
* @return 트리 객체
​​*/
    공개 함수 getParent($id)
    {
        $data = self::$_indexs[$id]->_parent;
        $this->_data = $data;
        $this를 반환합니다.
    }
    
    /**
* 지정된 ID를 가진 노드의 형제 노드를 가져옵니다
* *
* @param int $id
* @return 트리 객체
​​*/
    공개 함수 getBrother($id)
    {
        $data = self::$_indexs[$id]->_parent->_child;
        $this->_data = $data;
        $this를 반환합니다.
    }
    
    /**
* Tree 객체를 배열로 변환
* *
* @param 개체 $object
* @return 배열
​​*/
     공개 함수 toArray($obj = NULL)
     {
        $obj  = ($obj === NULL) ? $this->_data : $obj;
        $arr  = 배열();
        $_arr = is_object($obj) ? $this->_getBaseInfo($obj) : $obj;
        
        if (is_array($_arr)) {
            foreach($_arr as $key => $val){
                
                $val = (is_array($val) || is_object($val)) ? $this->toArray($val) : $val;
                $arr[$key] = $val;
            }
        } 다른 {
            새로운 예외 발생("_arr不是数组");
        }
     
        $arr를 반환합니다.
    }
    
    /**
* * 무한 루프를 방지하려면 _parent와 같은 필드를 필터링하세요.
* *
* @param 객체 $obj
* @return 무효
​​*/
    개인 함수 _getBaseInfo($obj)
    {
        $vars = get_object_vars($obj);
        $baseInfo['_info']  =  $vars['_info'];
        $baseInfo['_child'] =  $vars['_child'];
        $baseInfo를 반환합니다.
    }
    
    /**
* * 2차원 배열 정렬
* *
* 지정된 키 이름에 따라 2차원 배열을 오름차순 또는 내림차순으로 배열합니다
* *
* @param array $arr 2차원 배열
* @param string $keys
* @param string $type은 asc 또는 desc여야 합니다
* @throws는 매개변수가 잘못된 경우 예외를 발생시킵니다.
* @return 정렬된 배열을 반환합니다
​​*/
    개인 함수 _array_sort(array $arr, $keys, $type = 'asc') {
If (!is_string($keys)) {
                 새로운 예외 발생("잘못된 매개변수 키: 매개변수 키 유형은 문자열이어야 합니다.");            }
​  
          $keysvalue = $new_array = 배열()
foreach ($arr as $k=>$v) {
If (!is_array($v) || !isset($v[$keys])) {
                    throw new Exception("매개변수 arr이 2차원 배열이 아니거나 '{$keys}' 키가 arr 하위 요소에 존재하지 않습니다.");                }
               $keysvalue[$k] = $v[$keys]
           }
​  
          스위치($type) {
케이스 'asc':
분류($keysvalue)
휴식
케이스 '설명':
                arsort($keysvalue)
휴식
                  기본값:
throw new Exception("잘못된 매개변수 유형: 매개변수 유형의 값은 'asc' 또는 'desc'여야 합니다.")
           }
​  
          재설정($keysvalue)
foreach ($keysvalue as $k=>$v) {
               $new_array[$k] = $arr[$k]
           }
          $new_array 반환
}
}
?>

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