이 기사의 예에서는 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 프로그래밍 설계에 도움이 되기를 바랍니다.