PHP无限分类的代码谁有??? 广告: http://hi.baidu.com/zjstandup/blog/item/040d2b468ec18c0c6a63e5ce.html 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 <?phpclass Array2Tree{ private $_arr; private $_tree; public function __construct($arr) { $this->_arr = $arr; } private function _getdata($id) { $data = array(); foreach ($this->_arr as $key => $row) { if ($row["bid"] == $id) $data[] = $row; } return $data; } private function _load($id) { $set = $this->_getdata($id); if (0 == count($set)) { return $set; } else { foreach ($set as $row) { $sub = array($row["name"]); $sub['sub'] = $this->_load($row["id"]); $tree[] = $sub; } } return $tree; } public function load($id = 0) { $this->_tree = $this->_load($id); return $this; } public function gettree() { return $this->_tree; }}$arr = array( array("id"=>1, "bid"=>0, "name"=>"足球"), array("id"=>2, "bid"=>0, "name"=>"篮球"), array("id"=>3, "bid"=>1, "name"=>"巴西"), array("id"=>4, "bid"=>1, "name"=>"中国"), array("id"=>5, "bid"=>3, "name"=>"罗纳尔多"), array("id"=>6, "bid"=>4, "name"=>"米卢"),);?>简单写了一个,效率稍微有点问题,可以修改一下递归部分,把搜寻父节点的任务在递归中完成,那就不需要用_getdata函数遍历整个数组了下面是输出结果:$a2t = new Array2Tree($arr);$zero = $a2t->load()->gettree(); //默认输出整颗树print_r($zero);结果:Array( [0] => Array ( [0] => 足球 [sub] => Array ( [0] => Array ( [0] => 巴西 [sub] => Array ( [0] => Array ( [0] => 罗纳尔多 [sub] => Array ( ) ) ) ) [1] => Array ( [0] => 中国 [sub] => Array ( [0] => Array ( [0] => 米卢 [sub] => Array ( ) ) ) ) ) ) [1] => Array ( [0] => 篮球 [sub] => Array ( ) ))$one = $a2t->load(1)->gettree(); //load()方法接受树的节点号,输出该节点下的所有子节点print_r($one);结果:Array( [0] => Array ( [0] => 巴西 [sub] => Array ( [0] => Array ( [0] => 罗纳尔多 [sub] => Array ( ) ) ) ) [1] => Array ( [0] => 中国 [sub] => Array ( [0] => Array ( [0] => 米卢 [sub] => Array ( ) ) ) )) joomla里面有串好代码,很简单很强大./*id bid name1 0 足球 2 0 篮球 3 1 巴西 4 1 中国 5 3 罗纳尔多 6 4 米卢 */ $array[0] = array("id"=>1,"bid"=>0,"name"=>"足球");$array[1] = array("id"=>2,"bid"=>0,"name"=>"篮球");$array[2] = array("id"=>3,"bid"=>1,"name"=>"巴西");$array[3] = array("id"=>4,"bid"=>1,"name"=>"中国");$array[4] = array("id"=>5,"bid"=>3,"name"=>"罗纳尔多");$array[5] = array("id"=>6,"bid"=>4,"name"=>"米卢");//tree array -- copy some codes from joomla$tree = array();if( $array ){ foreach ( $array as $v ){ $pt = $v['bid']; $list = @$tree[$pt] ? $tree[$pt] : array(); array_push( $list, $v ); $tree[$pt] = $list; }}//foreach root nodeforeach($tree[0] as $k=>$v){ echo $v['name']."<br/>"; if($tree[$v['id']]) drawTree($tree[$v['id']],$tree,0); }//foreach child nodefunction drawTree($arr,$tree,$level){ $level++; $prefix = str_pad("|",$level+1,'-',STR_PAD_RIGHT); foreach($arr as $k2=>$v2) { echo $prefix.$v2['name']."<br/>"; if($tree[$v2['id']]) drawTree($tree[$v2['id']],$tree,$level); }}exit; PHP中回调函数的写法求解 锁定订单 dw怎么用? ffmpeg报错。。。。 [MYSQL问题]当SUM()遇到WHERE的时候 zend一加上就出错,请问为何? 下载了一些网站的全站php代码,怎么无从入手修改? 请问 关于隐藏浏览器中地址栏路径的问题!!? PHP PDO 执行query一直返回false 关于PHP里SELECT菜单的取值问题,请帮忙看下! 为什么session会失效???
class Array2Tree
{
private $_arr;
private $_tree;
public function __construct($arr) {
$this->_arr = $arr;
}
private function _getdata($id) {
$data = array();
foreach ($this->_arr as $key => $row) {
if ($row["bid"] == $id)
$data[] = $row;
}
return $data;
}
private function _load($id) {
$set = $this->_getdata($id);
if (0 == count($set)) {
return $set;
} else {
foreach ($set as $row) {
$sub = array($row["name"]);
$sub['sub'] = $this->_load($row["id"]);
$tree[] = $sub;
}
}
return $tree;
}
public function load($id = 0) {
$this->_tree = $this->_load($id);
return $this;
}
public function gettree() {
return $this->_tree;
}
}
$arr = array(
array("id"=>1, "bid"=>0, "name"=>"足球"),
array("id"=>2, "bid"=>0, "name"=>"篮球"),
array("id"=>3, "bid"=>1, "name"=>"巴西"),
array("id"=>4, "bid"=>1, "name"=>"中国"),
array("id"=>5, "bid"=>3, "name"=>"罗纳尔多"),
array("id"=>6, "bid"=>4, "name"=>"米卢"),
);
?>
简单写了一个,效率稍微有点问题,可以修改一下递归部分,把搜寻父节点的任务在递归中完成,那就不需要用_getdata函数遍历整个数组了
下面是输出结果:$a2t = new Array2Tree($arr);
$zero = $a2t->load()->gettree(); //默认输出整颗树
print_r($zero);
结果:
Array
(
[0] => Array
(
[0] => 足球
[sub] => Array
(
[0] => Array
(
[0] => 巴西
[sub] => Array
(
[0] => Array
(
[0] => 罗纳尔多
[sub] => Array
(
) ) ) ) [1] => Array
(
[0] => 中国
[sub] => Array
(
[0] => Array
(
[0] => 米卢
[sub] => Array
(
) ) ) ) ) ) [1] => Array
(
[0] => 篮球
[sub] => Array
(
) ))$one = $a2t->load(1)->gettree(); //load()方法接受树的节点号,输出该节点下的所有子节点
print_r($one);
结果:
Array
(
[0] => Array
(
[0] => 巴西
[sub] => Array
(
[0] => Array
(
[0] => 罗纳尔多
[sub] => Array
(
) ) ) ) [1] => Array
(
[0] => 中国
[sub] => Array
(
[0] => Array
(
[0] => 米卢
[sub] => Array
(
) ) ) ))
id bid name
1 0 足球
2 0 篮球
3 1 巴西
4 1 中国
5 3 罗纳尔多
6 4 米卢
*/
$array[0] = array("id"=>1,"bid"=>0,"name"=>"足球");
$array[1] = array("id"=>2,"bid"=>0,"name"=>"篮球");
$array[2] = array("id"=>3,"bid"=>1,"name"=>"巴西");
$array[3] = array("id"=>4,"bid"=>1,"name"=>"中国");
$array[4] = array("id"=>5,"bid"=>3,"name"=>"罗纳尔多");
$array[5] = array("id"=>6,"bid"=>4,"name"=>"米卢");//tree array -- copy some codes from joomla
$tree = array();
if( $array ){
foreach ( $array as $v ){
$pt = $v['bid'];
$list = @$tree[$pt] ? $tree[$pt] : array();
array_push( $list, $v );
$tree[$pt] = $list;
}
}//foreach root node
foreach($tree[0] as $k=>$v)
{
echo $v['name']."<br/>";
if($tree[$v['id']]) drawTree($tree[$v['id']],$tree,0);
}
//foreach child node
function drawTree($arr,$tree,$level)
{
$level++;
$prefix = str_pad("|",$level+1,'-',STR_PAD_RIGHT);
foreach($arr as $k2=>$v2)
{
echo $prefix.$v2['name']."<br/>";
if($tree[$v2['id']]) drawTree($tree[$v2['id']],$tree,$level);
}
}
exit;