代码如下
* $sourcearr 原来的数组
* $key 主键
* $parentkey 与主键关联的父主键
* $childrenkey 生成的孩子的键名
*
*/
function arraytotree($sourcearr, $key, $parentkey, $childrenkey)
{
$tempsrcarr = array();
foreach ($sourcearr as $v)
{
$tempsrcarr[$v[$key]] = $v;
}
$i = 0;
$count = count($sourcearr);
for($i = ($count - 1); $i >=0; $i--)
{
if (isset($tempsrcarr[$sourcearr[$i][$parentkey]]))
{
$tarr = array_pop($tempsrcarr);
$tempsrcarr[$tarr[$parentkey]][$childrenkey] = (isset($tempsrcarr[$tarr[$parentkey]][$childrenkey]) && is_array($tempsrcarr[$tarr[$parentkey]][$childrenkey])) ? $tempsrcarr[$tarr[$parentkey]][$childrenkey] : array();
array_push ($tempsrcarr[$tarr[$parentkey]][$childrenkey], $tarr);
}
}
return $tempsrcarr;
}
php代码
* 将数组转换成树
* 例子:将 array(
array('id'=>1,'parentid' => 0,'name'=> 'name1')
,array('id'=>2,'parentid' => 0,'name'=> 'name2')
,array('id'=>4,'parentid' => 1,'name'=> 'name1_4')
,array('id'=>15,'parentid' => 1,'name'=> 'name1_5')
);转换成
* array(
[1] => array([id] => 1
[parentid] => 0
[name] => name1
[children] => array(
[0] => array([id] => 15,[parentid] => 1,[name] => name1_5)
[1] => array([id] => 4,[parentid] => 1,[name] => name1_4)
)
)
[2] => array([id] => 2,[parentid] => 0,[name] => name2)
)
* @param array $sourcearr 要转换的数组
* @param string $key 数组中确认父子的key,例子中为“id”
* @param string $parentkey 数组中父key,例子中为“parentid”
* @param type $childrenkey 要在树节点上索引子节点的key,例子中为“children”
* @return array 返回生成的树
*/
代码如下
function arraytotree($sourcearr, $key, $parentkey, $childrenkey)
{
$tempsrcarr = array();
$allroot = true;
foreach ($sourcearr as $v)
{
$isleaf = true;
foreach ($sourcearr as $cv )
{
if (($v[$key]) != $cv[$key])
{
if ($v[$key] == $cv[$parentkey])
{
$isleaf = false;
}
if ($v[$parentkey] == $cv[$key])
{
$allroot = false;
}
}
}
if ($isleaf)
{
$leafarr[$v[$key]] = $v;
}
$tempsrcarr[$v[$key]] = $v;
}
if ($allroot)
{
return $tempsrcarr;
}
else
{
unset($v, $cv, $sourcearr, $isleaf);
foreach ($leafarr as $v)
{
if (isset($tempsrcarr[$v[$parentkey]]))
{
$tempsrcarr[$v[$parentkey]][$childrenkey] = (isset($tempsrcarr[$v[$parentkey]][$childrenkey]) && is_array($tempsrcarr[$v[$parentkey]][$childrenkey])) ? $tempsrcarr[$v[$parentkey]][$childrenkey] : array();
array_push ($tempsrcarr[$v[$parentkey]][$childrenkey], $v);
unset($tempsrcarr[$v[$key]]);
}
}
unset($v);
return arraytotree($tempsrcarr, $key, $parentkey, $childrenkey);
}
}
php代码
/**递归方法:**/
$rows = array(
0 => array('id' => 1, 'name' => '菜单1', 'parentid' => 0)
, 1 => array('id' => 2, 'name' => '菜单2', 'parentid' => 0)
, 2 => array('id' => 3, 'name' => '菜单3', 'parentid' => 0)
, 3 => array('id' => 4, 'name' => '菜单1_1', 'parentid' => 1)
, 4 => array('id' => 5, 'name' => '菜单1_2', 'parentid' => 1)
, 5 => array('id' => 6, 'name' => '菜单2_1', 'parentid' => 2)
);
print_r(gettree($rows, 0, 'id', 'parentid'));
代码如下
/**
* 数组根据父id生成树
* @staticvar int $depth 递归深度
* @param array $data 数组数据
* @param integer $pid 父id的值
* @param string $key id在$data数组中的键值
* @param string $chrildkey 要生成的子的键值
* @param string $pkey 父id在$data数组中的键值
* @param int $maxdepth 最大递归深度,防止无限递归
* @return array 重组后的数组
*/
function gettree($data, $pid = 0, $key = 'id', $pkey = 'parentid', $childkey = 'child', $maxdepth = 0){
static $depth = 0;
$depth++;
if (intval($maxdepth) {
$maxdepth = count($data) * count($data);
}
if ($depth > $maxdepth)
{
exit(error recursion:max recursion depth {$maxdepth});
}
$tree = array();
foreach ($data as $rk => $rv)
{
if ($rv[$pkey] == $pid)
{
$rv[$childkey] = gettree($data, $rv[$key], $key, $pkey, $childkey, $maxdepth);
$tree[] = $rv;
}
}
return $tree;
}
一个实例
代码如下 复制代码
tree
array('id'=>1, 'cname'=>'一级分类', 'pid'=>0),
100 => array('id'=>100, 'cname'=>'特意加进去的二级分类', 'pid'=>1),
101 => array('id'=>101, 'cname'=>'特意加进去的二级分类2222222222', 'pid'=>1),
2 => array('id'=>2, 'cname'=>'二级分类', 'pid'=>1),
3 => array('id'=>3, 'cname'=>'三级分类', 'pid'=>2),
4 => array('id'=>4, 'cname'=>'四级分类', 'pid'=>3),
5 => array('id'=>5, 'cname'=>'四级分类2', 'pid'=>3),
200 => array('id'=>200, 'cname'=>'55555', 'pid'=>5),
6 => array('id'=>6, 'cname'=>'另一级分类', 'pid'=>0),
7 => array('id'=>7, 'cname'=>'first first first', 'pid'=>0),
8 => array('id'=>8, 'cname'=>'first first first', 'pid'=>7),
);
// 指定分类id,返回子类量(不进行深度递归)
function getchildtotal($id)
{
global $tree;
$total = 0;
foreach($tree as $value)
{
if ($id == $value['pid'])
{
$total++;
}
}
return $total;
}
// 指定分类id,www.111cn.net并返回数组(不进行深度递归)
function getchildarray($id)
{
global $tree;
$array = array();
foreach($tree as $key=>$value)
{
if ($id == $value['pid'])
{
$array[$key] = $value;
}
}
return $array;
}
// 递归查询方式将树数组转换成html嵌套树
function gettreehtml($tree,$level = 0)
{
if ($tree)
{
$level += 1;
foreach($tree as $id => $node)
{
$html .=
;
$html .= ''.$node['cname'].;
if (getchildtotal($node['id']))
{
$tree_last = getchildarray($node['id']); $html .= '
';
$html .= gettreehtml($tree_last,$level);
$html .= ''; }
$html .= '
';
}
}
return $html;
} $html = gettreehtml( getchildarray(0) );
echo '
';
echo $html;
echo '
'; ?>
http://www.bkjia.com/phpjc/730238.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/730238.htmltecharticlephp代码 代码如下 * $sourcearr 原来的数组 * $key 主键 * $parentkey 与主键关联的父主键 * $childrenkey 生成的孩子的键名 * */ function arraytotree($source...
