간단히 말하면 Infinitus 분류는 Windows에서 새 폴더를 생성한 다음 이 폴더 내에서 일부 폴더를 만들 수 있고 폴더 아래에 일부 폴더를 만들 수도 있습니다.
그럼 PHP는 어떻게 무한 분류를 달성하나요? 다양한 카테고리를 하나씩 나열하는 방법은 무엇입니까?
우선 이런 배열이 있다고 가정해 봅시다
$arr = array( 0=>array( 'cid'=>1, 'pid'=>0, 'name'=>'亚洲', ), 1=>array( 'cid'=>2, 'pid'=>0, 'name'=>'北美洲', ), 2=>array( 'cid'=>3, 'pid'=>1, 'name'=>'中国', ), 3=>array( 'cid'=>4, 'pid'=>2, 'name'=>'美国', ), 4=>array( 'cid'=>5, 'pid'=>3, 'name'=>'北京', ), 5=>array( 'cid'=>6, 'pid'=>3, 'name'=>'河北', ), 6=>array( 'cid'=>7, 'pid'=>5, 'name'=>'东城区', ), 7=>array( 'cid'=>8, 'pid'=>5, 'name'=>'海淀区', ), );
그림과 같은 비슷한 디스플레이가 필요합니다
이 배열을 위 그림처럼 직관적으로 표시하려면, PHP를 사용하여 재귀적으로 구현하려면 어떻게 구현해야 합니까? 아래 핵심 코드를 보세요
코드 복사
private function GetTree($arr,$pid,$step){ global $tree; foreach($arr as $key=>$val) { if($val['pid'] == $pid) { $flg = str_repeat('└―',$step); $val['name'] = $flg.$val['name']; $tree[] = $val; $this->GetTree($arr , $val['cid'] ,$step+1); } } return $tree; }
코드 복사
그럼 호출 코드만 작성하면 됩니다
$newarr = $this->GetTree($arr, 0, 0);
(yii2 프레임워크에서) 서브클래스 ID를 기반으로 모든 상위 분류 정보를 알아보세요
방법 1:
public static function get_parent_list($arr,$id){ //$arr 所有分类列表 //$id 父级分类id static $list=array(); foreach($arr as $u){ if($u['id']== $id){//父级分类id等于所查找的id $list[]=$u; if($u['parent_id']>0){ self::get_parent_list($arr,$u['parent_id']); } } } return $list; }
이렇게 하면 재귀 쿼리 없이 분류 정보를 캐시에 저장할 수 있습니다.
방법 2: 분류 정보를 얻기 위한 재귀 쿼리
public static function get_parents($id){ static $list = []; $cat_data = Category::findOne($id)->toarray(); if($cat_data){ $list[] = $cat_data; $id = $cat_data['parent_id']; if($cat_data['parent_id'] > 0){ self::get_parents($id); } } return $list; }
무한 분류를 달성해야 하므로 해당 하위 열이 무엇인지 알아야 합니다.
최종적으로 구현된 배열은
[php] view plain copyArray ( [0] => Array ( [category_id] => 1 [category_name] => 关于我 [category_pid] => 0 [category_addtime] => 0 [category_order] => 0 ) [1] => Array ( [category_id] => 2 [category_name] => 生活随笔 [category_pid] => 0 [category_addtime] => 0 [category_order] => 0 ) [2] => Array ( [category_id] => 3 [category_name] => 文章类别 [category_pid] => 0 [category_addtime] => 0 [category_order] => 0 [category_child] => Array ( [0] => Array ( [category_id] => 4 [category_name] => Linux服务器 [category_pid] => 3 [category_addtime] => -28800 [category_order] => 1 [category_child] => Array ( [0] => Array ( [category_id] => 5 [category_name] => linux优化 [category_pid] => 4 [category_addtime] => 0 [category_order] => 0 ) [1] => Array ( [category_id] => 6 [category_name] => 虚拟化 [category_pid] => 4 [category_addtime] => 1478228220 [category_order] => 0 ) [2] => Array ( [category_id] => 7 [category_name] => Mysql优化与开发 [category_pid] => 4 [category_addtime] => 1478188800 [category_order] => 0 ) [3] => Array ( [category_id] => 8 [category_name] => 高可用与虚拟化 [category_pid] => 4 [category_addtime] => 1478394120 [category_order] => 0 ) ) ) [1] => Array ( [category_id] => 15 [category_name] => Mysql [category_pid] => 3 [category_addtime] => 1480555980 [category_order] => 0 [category_child] => Array ( [0] => Array ( [category_id] => 16 [category_name] => 优化 [category_pid] => 15 [category_addtime] => 1480555980 [category_order] => 0 ) [1] => Array ( [category_id] => 17 [category_name] => Sql编程 [category_pid] => 15 [category_addtime] => 1480556040 [category_order] => 8 ) ) ) ) ) )
형식입니다. 그렇다면 데이터베이스에서 꺼내온 2차원 배열이 어떻게 위와 같은 배열이 될 수 있을까요?
예:
위의 형태로 다음과 같은 2차원 배열을 구현하고 싶습니다.
[php] view plain copy
$arr=array( array('id'=>'1','name'=>'北京','pid'=>'0'), array('id'=>'2','name'=>'上海','pid'=>'0'), array('id'=>'3','name'=>'浦东','pid'=>'2'), array('id'=>'4','name'=>'朝阳','pid'=>'1'), array('id'=>'5','name'=>'广州','pid'=>'0'), array('id'=>'6','name'=>'三里屯','pid'=>'4'), array('id'=>'7','name'=>'广东','pid'=>'5'), array('id'=>'8','name'=>'三里','pid'=>'4'), array('id'=>'10','name'=>'小胡同','pid'=>'8') );
첫 번째 방법: 배열의 인덱스를 기본 키의 ID 번호와 동일하게 사용하여 하위 열을 찾습니다. 먼저 배열에 인덱스를 추가합니다. [php] view plain copy
$arr=array( 1=>array('id'=>'1','name'=>'北京','pid'=>'0'), 2=>array('id'=>'2','name'=>'上海','pid'=>'0'), 3=>array('id'=>'3','name'=>'浦东','pid'=>'2'), 4=>array('id'=>'4','name'=>'朝阳','pid'=>'1'), 5=>array('id'=>'5','name'=>'广州','pid'=>'0'), 6=>array('id'=>'6','name'=>'三里屯','pid'=>'4'), 7=>array('id'=>'7','name'=>'广东','pid'=>'5'), 8=>array('id'=>'8','name'=>'三里','pid'=>'4'), 10=>array('id'=>'10','name'=>'小胡同','pid'=>'8') );
사용 인덱스의 첨자는 열에 상위 열이 있는지 확인하는 데 사용됩니다. 존재하는 경우 해당 열을 상위 열의 아들 배열에 넣습니다.[php] view plain copy
function generateTree($items){ $tree = array(); foreach($items as $item){ //判断是否有数组的索引== if(isset($items[$item['pid']])){ //查找数组里面是否有该分类 如 isset($items[0]) isset($items[1]) $items[$item['pid']]['son'][] = &$items[$item['id']]; //上面的内容变化,$tree里面的值就变化 }else{ $tree[] = &$items[$item['id']]; //把他的地址给了$tree } } return $tree; }
위 프로그램에 큰 문제가 있습니다. 배열의 인덱스는 우리가 수동으로 추가했나요? 그러면 배열 인덱스를 자동으로 추가할 수 있나요? 물론 다음 프로그램을 구현할 수도 있습니다. 자동으로 배열에 인덱스를 추가한 다음 하위 열을 상위 열의 배열에 넣습니다. 아이디어는 위 프로그램
function make_tree($list,$pk='id',$pid='pid',$child='_child',$root=0){ $tree=array(); $packData=array(); foreach ($list as $data) { <span style="white-space:pre"> </span>//转换为带有主键id的数组 $packData[$data[$pk]] = $data; //$packData[1]=$data; $packData[2]=$data } foreach ($packData as $key =>$val){ if($val[$pid]==$root){ //代表跟节点 $tree[]=& $packData[$key]; }else{ //找到其父类 $packData[$val[$pid]][$child][]=& $packData[$key]; } } return $tree; }Second 또 다른 방법: 재귀를 사용하여 하위 열 찾기
아이디어: 재귀를 사용하여 각 열의 하위 열을 찾습니다. 마지막 하위 열을 찾을 때까지 계층별로 디버깅을 실행하면 인쇄할 수 있습니다. it in the tree
, 이해를 돕기 위해 $tree를 인쇄하여 배열의 변경 사항을 관찰할 수 있습니다.
array('id'=>'6','name'=>'三里屯','pid'=>'4'), [php] view plain copyfunction make_tree1($list,$pk='id',$pid='pid',$child='_child',$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['_child']=$child; } } $tree[]=$val; } } return $tree; }재귀를 더 잘 이해하려면 다음을 수행하세요. 다음 합계 프로그램과 같은 테스트할 작은 프로그램을 찾으세요
모두 10, 9--2 대신 2, 3...10에서 $n의 출력을 분석할 수 있습니다. 위 프로그램의 재귀가 구현되었습니다. 간단히 말해서 재귀는 매우 흥미롭습니다. 한 가지, 모두가 잘 이해할 수 있기를 바랍니다
[php] 일반 사본 보기function sum($n){ $a=0; if($n>1){ $a=sum($n-1)+$n; /*if($n>5){ echo "$n <br />" ; }*/ echo "$n<br />"; }else{ $a=1; } return $a; } echo sum(10);
#$id = 父级id, $array = 所有分类public function getSon($id,$array){ static $list; foreach ($array as $k => $v) { if($v['parent_id'] == $id){ $list[] = $array[$k]; self::getSon($v['id'],$array); } } return $list; }
php Infinitus Classification
먼저 Infinitus Extreme 분류가 무엇인지 소개하겠습니다. 간단히 말하면, Infinitus 분류는 Windows에서 새 폴더를 생성한 다음 다른 폴더를 생성할 수 있는 것처럼 범주를 여러 하위 범주로 나눈 다음 하나의 하위 범주를 여러 다른 하위 범주로 무한정 나눌 수 있음을 의미합니다. 이 폴더에 몇 개의 폴더를 만들 수 있고, 폴더 아래에 몇 개의 폴더를 만들 수도 있습니다.
$arr = array( 0=>array( 'cid'=>1, 'pid'=>0, 'name'=>'亚洲', ), 1=>array( 'cid'=>2, 'pid'=>0, 'name'=>'北美洲', ), 2=>array( 'cid'=>3, 'pid'=>1, 'name'=>'中国', ), 3=>array( 'cid'=>4, 'pid'=>2, 'name'=>'美国', ), 4=>array( 'cid'=>5, 'pid'=>3, 'name'=>'北京', ), 5=>array( 'cid'=>6, 'pid'=>3, 'name'=>'河北', ), 6=>array( 'cid'=>7, 'pid'=>5, 'name'=>'东城区', ), 7=>array( 'cid'=>8, 'pid'=>5, 'name'=>'海淀区', ), );그림과 같은 비슷한 디스플레이가 필요합니다
이 배열을 위 그림처럼 직관적으로 표시하려면, PHP를 사용하여 재귀적으로 구현하려면 어떻게 구현해야 합니까? 아래 핵심 코드를 보세요
private function GetTree($arr,$pid,$step){ global $tree; foreach($arr as $key=>$val) { if($val['pid'] == $pid) { $flg = str_repeat('└―',$step); $val['name'] = $flg.$val['name']; $tree[] = $val; $this->GetTree($arr , $val['cid'] ,$step+1); } } return $tree; }코드 복사
그럼 호출 코드만 작성하면 됩니다
$newarr = $this->GetTree($arr, 0, 0);
(yii2 프레임워크에서) 서브클래스 ID를 기반으로 모든 상위 분류 정보를 알아보세요
public static function get_parent_list($arr,$id){ //$arr 所有分类列表 //$id 父级分类id static $list=array(); foreach($arr as $u){ if($u['id']== $id){//父级分类id等于所查找的id $list[]=$u; if($u['parent_id']>0){ self::get_parent_list($arr,$u['parent_id']); } } } return $list; }이렇게 하면 재귀 쿼리 없이 분류 정보를 캐시에 저장할 수 있습니다.
방법 2: 분류 정보를 얻기 위한 재귀 쿼리
public static function get_parents($id){ static $list = []; $cat_data = Category::findOne($id)->toarray(); if($cat_data){ $list[] = $cat_data; $id = $cat_data['parent_id']; if($cat_data['parent_id'] > 0){ self::get_parents($id); } } return $list; }
무한 분류를 달성해야 하므로 해당 하위 열이 무엇인지 알아야 합니다.
[php] view plain copyArray ( [0] => Array ( [category_id] => 1 [category_name] => 关于我 [category_pid] => 0 [category_addtime] => 0 [category_order] => 0 ) [1] => Array ( [category_id] => 2 [category_name] => 生活随笔 [category_pid] => 0 [category_addtime] => 0 [category_order] => 0 ) [2] => Array ( [category_id] => 3 [category_name] => 文章类别 [category_pid] => 0 [category_addtime] => 0 [category_order] => 0 [category_child] => Array ( [0] => Array ( [category_id] => 4 [category_name] => Linux服务器 [category_pid] => 3 [category_addtime] => -28800 [category_order] => 1 [category_child] => Array ( [0] => Array ( [category_id] => 5 [category_name] => linux优化 [category_pid] => 4 [category_addtime] => 0 [category_order] => 0 ) [1] => Array ( [category_id] => 6 [category_name] => 虚拟化 [category_pid] => 4 [category_addtime] => 1478228220 [category_order] => 0 ) [2] => Array ( [category_id] => 7 [category_name] => Mysql优化与开发 [category_pid] => 4 [category_addtime] => 1478188800 [category_order] => 0 ) [3] => Array ( [category_id] => 8 [category_name] => 高可用与虚拟化 [category_pid] => 4 [category_addtime] => 1478394120 [category_order] => 0 ) ) ) [1] => Array ( [category_id] => 15 [category_name] => Mysql [category_pid] => 3 [category_addtime] => 1480555980 [category_order] => 0 [category_child] => Array ( [0] => Array ( [category_id] => 16 [category_name] => 优化 [category_pid] => 15 [category_addtime] => 1480555980 [category_order] => 0 ) [1] => Array ( [category_id] => 17 [category_name] => Sql编程 [category_pid] => 15 [category_addtime] => 1480556040 [category_order] => 8 ) ) ) ) ) )형식입니다. 그렇다면 데이터베이스에서 꺼내온 2차원 배열이 어떻게 위와 같은 배열이 될 수 있을까요?
예:
위의 형태로 다음과 같은 2차원 배열을 구현하고 싶습니다.
$arr=array( array('id'=>'1','name'=>'北京','pid'=>'0'), array('id'=>'2','name'=>'上海','pid'=>'0'), array('id'=>'3','name'=>'浦东','pid'=>'2'), array('id'=>'4','name'=>'朝阳','pid'=>'1'), array('id'=>'5','name'=>'广州','pid'=>'0'), array('id'=>'6','name'=>'三里屯','pid'=>'4'), array('id'=>'7','name'=>'广东','pid'=>'5'), array('id'=>'8','name'=>'三里','pid'=>'4'), array('id'=>'10','name'=>'小胡同','pid'=>'8') );첫 번째 방법: 배열의 인덱스를 기본 키의 ID 번호와 동일하게 사용하여 하위 열을 찾습니다. 먼저 배열에 인덱스를 추가합니다. [php] 일반 사본 보기
$arr=array( 1=>array('id'=>'1','name'=>'北京','pid'=>'0'), 2=>array('id'=>'2','name'=>'上海','pid'=>'0'), 3=>array('id'=>'3','name'=>'浦东','pid'=>'2'), 4=>array('id'=>'4','name'=>'朝阳','pid'=>'1'), 5=>array('id'=>'5','name'=>'广州','pid'=>'0'), 6=>array('id'=>'6','name'=>'三里屯','pid'=>'4'), 7=>array('id'=>'7','name'=>'广东','pid'=>'5'), 8=>array('id'=>'8','name'=>'三里','pid'=>'4'), 10=>array('id'=>'10','name'=>'小胡同','pid'=>'8') );
利用索引的下标,判断该栏目是否存在父栏目,如果存在就把该栏目放到父栏目的son子数组里面
[php] view plain copy
function generateTree($items){ $tree = array(); foreach($items as $item){ //判断是否有数组的索引== if(isset($items[$item['pid']])){ //查找数组里面是否有该分类 如 isset($items[0]) isset($items[1]) $items[$item['pid']]['son'][] = &$items[$item['id']]; //上面的内容变化,$tree里面的值就变化 }else{ $tree[] = &$items[$item['id']]; //把他的地址给了$tree } } return $tree; }
上面这个程序有一个主要问题,数组的索引是我们手动添加的?那我们可不可以自动添加数组索引呢?当然可以,下面这个程序就实现了,自动为数组添加索引然后再把子栏目放到父栏目的son数组中,思想和上面的程序是一样的
[php] view plain copy
function make_tree($list,$pk='id',$pid='pid',$child='_child',$root=0){ $tree=array(); $packData=array(); foreach ($list as $data) { <span style="white-space:pre"> </span>//转换为带有主键id的数组 $packData[$data[$pk]] = $data; //$packData[1]=$data; $packData[2]=$data } foreach ($packData as $key =>$val){ if($val[$pid]==$root){ //代表跟节点 $tree[]=& $packData[$key]; }else{ //找到其父类 $packData[$val[$pid]][$child][]=& $packData[$key]; } } return $tree; }
第二种方法:使用递归来查找子栏目
思想:使用递归来查找每个栏目中的子栏目,直到找到最后一个子栏目以后再一层层往外运行调试的话,可以打印
tree中,,为了方便理解,可以打印$tree去观察数组的变化
[php] view plain copy
array('id'=>'6','name'=>'三里屯','pid'=>'4'), [php] view plain copyfunction make_tree1($list,$pk='id',$pid='pid',$child='_child',$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['_child']=$child; } } $tree[]=$val; } } return $tree; }
为了更好的理解递归,大家可以找一个小程序测试一下例如下面这个求和的程序
大家可以分析一下$n的输出从2,3 …..10,而不是从10,9—-2,我从这个程序才理解了一下上面那个程序的递归是如何实现的,总之:递归是很有意思的一个东西,希望大家好好理解
[php] view plain copy
function sum($n){ $a=0; if($n>1){ $a=sum($n-1)+$n; /*if($n>5){ echo "$n <br />" ; }*/ echo "$n<br />"; }else{ $a=1; } return $a; } echo sum(10);
根据父id获得所有下级子类id的数据
#$id = 父级id, $array = 所有分类public function getSon($id,$array){ static $list; foreach ($array as $k => $v) { if($v['parent_id'] == $id){ $list[] = $array[$k]; self::getSon($v['id'],$array); } } return $list; }
相关推荐:
위 내용은 PHP Infinitus 분류에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!