在使用无限极分类管理数据的技术的时候,我们常常面临一些必要的麻烦。棋种最重要也是最基本的就是怎么把查出的信息整理好。比如把信息分类,子类信息要放到父类信息中,实现嵌套,从而让查询出来的数据有序化,便于后续的使用。这个过程个人理解为序列化(跟前端表单提交数据的序列化没有联系)—-将杂乱的数据信息通过内在的联系整理为有序,有规则的有序数组的过程。
举个例子:
数据库中有以下数据:
通过php查询出来是二位数组:
//php查询代码:
$rs = array();
$type = array();
//查找出数据库中所有的数据,放入数组中保存。后续所有查找都在在数组中进行。
$sql = 'select * from type ' ;
$rs = mysql_query( $sql );
while( $row = mysql_fetch_array( $rs ,MYSQL_ASSOC) )
{
$type[$row['id']] = $row ;
}
打印结果:
可以看到这样的数据使用并不是很方便,特别是在类型关系的展现上显得凌乱。
我们希望的数组形式应该是:
//php
* [1]=>[
* []=>[],
* []=>[]
* ]
* [2]=>[
* ` []=>[];
* []=>[
* []=>[]
* ]
* ]
* 第一级 第二级 第三级
[] =[
[1]=>[
['吴国'],
['sub']=>[
['孙权'],
['陆逊'],
]
],
[2]=>[
['魏国'],
['sub']=>[
['曹操'],
]
],
[3]=>[
['蜀国'],
['sub']=>[
['刘备'],
]
]
]
// 第一层 第二层 第三层
为了得到以上格式的数据。需要经过2个步骤。
第一查询数据。只要有id就能找到这个id所对应的数组。
//php代码
//在数组中查找指定的id
function findPid ( $pid = 1 , & $arr = array() ,$boo = false ,$a =array() )
{
if( is_array( $arr ) )
{
foreach ( $arr as $k=> $v )
{
if ( $k == $pid )
{
//echo "这是{$k}的<br/>";
// print_r( $v );
if( ! $boo )
{
//$boo是false表示只找
return $arr[$k];
}
else
{
if( isset( $arr[$k]['sub'] ) )
{
//有子类型
$arr[$k]['sub'] [$a['id']] = $a ;
}
else
{
//没有子类型
$arr[$k]['sub'] = array() ;
$arr[$k]['sub'] [$a['id']] = $a ;
}
return true;
}
}
else
{
if( isset( $v['sub'] ) )
{
findPid( $pid , $v ,$boo ,$a);//递归
}
}
}
}
else
{
return false;
}
}
第二步将子类型的数组和父类型数组合并。
比如:将元素曹操放到魏国类型下面。并在魏国数组中创建’sub’属性,其内容为元素的pid为魏国的id。
//php
function getLeaderArray( $array = array() )
{
$leaderArray = array ();
if( is_array( $array ) )
{
//必须是数组
foreach ( $array as $k=> $v )
{
if( $v['pid'] == 0 )
{
//顶层数组保留
$leaderArray[$k] = $v ;
}
else
{
//否则要放到其父类型的'sub'属性里面
if( findPid( $v['pid'] , $leaderArray , true , $array[$k] ))//找到父类型添加进父类型或者没找到
{
//子类型添加完成
}
else
{
//在数组中没有找到
// 自动将改父类型补充为顶层元素
$leaderArray[$v['pid']] = [
'id'=> $v['pid'],
'pid' =>0,
'name'=>'',
'sub'=> [
$k=> $array[$k]
]
];
}
}
}
return $leaderArray;
}
else
{
return $array;
}
}
经过以上2个步骤,数组可以整理得到如下形式: