我的递归函数返回数组为什么出错了

function get_tree($table,$parent_id=0,$level=1){
global $db; global $tpf;global $smarty;
$sql= "SELECT id,cate_name as name FROM `{$tpf}$table` WHERE `parent_id`=$parent_id ORDER BY id DESC";
$res = $db->get_result_rows($sql); //取得一记录以二维数组返回 $arr[0]['id']'$arr[1]['name']
static $arr = array();
foreach($res as $key=>$rows){
$arr[$key]['id'] = $rows['id'];
$arr[$key]['name'] = $rows['name'];
$arr[$key]['level'] = $level;
get_tree($table,$rows['id'],$level+1);
}
return $arr;
}
$c = get_tree("str_news_categories");
print_r($c);

我测试了返回的数组结果是错误!

作者: kinghong24   发布时间: 2011-02-16

代码不全。

作者: ihefe   发布时间: 2011-02-16

数据库类:
class Mysql {
/**
 * mysql连接执行类,将sql的执行实现数据库无关性
 * 
 *
 *
 */

 /**
  * 类变量定义
  * @param $conn mysql连接号
  * @param $error 错误代号
  * @param $username/$password 数据库连接用户名和密码
  * @param array $err_info 错误信息
  * 
  * @param $debuginfo 调试信息
  * @param $table 当前操作数据表
  */
 var $conn; 
 var $error;
 var $username = "";
 var $password = "";
 var $host;
 var $database;
 var $err_info = array(
  0 => "没有错误!",
  1 => "数据库连接失败!",
  2 => "sql执行出错!"
 );
 var $debuginfo="";
 var $table;

 function Mysql( $arr=null ) {
  if( is_array($arr) ) {//var_dump($arr);
  $this->set_login( $arr['host'] , $arr['username'] , $arr['password'] );
  $this->set_db( $arr['database'] );
  $this->set_conn();
  if( isset($this->error) && $this->error!=0 ) die($this->err_info[$this->error]);
  }
 }

 /**
  * 设置数据库名
  * @param string $database
  *
  * return void
  */
 function set_db ( $dbfile ){
  $this->database = $dbfile;
 }
 /**
  * 设置连接数据库的用户名和密码
  * @param string $user 用户名
  * @param string $pwd 密码
  *
  * @return void
  */
 function set_login ( $host , $user , $pwd ){
 
  $this->host=$host;
  $this->username=$user;
  $this->password=$pwd;
  
 }
 
 /**
  * 创建数据库连接
  * @param 
  * return void
  */
 function set_conn (){
 
  $this->conn=@mysql_connect($this->host,$this->username,$this->password );
  @mysql_query("set character set utf8");
  @mysql_query("set names utf8");
   
  if ( isset($this->conn) && @mysql_select_db($this->database) ) 
  $this->error=0;
  else 
  $this->error=1;
 }
 
 /**
  * 设置当前操作的数据表
  * @param string $tb
  * 
  * @return void
  */
 function set_table( $tb ) {
  $this->table = $tb; 
 }
 
 /**
  * 获取数据表总条数
  * @param array $condition 条件数组 
  * @param string $tb 要操作的数据表
 **/
 function get_count( $tb = "" , $condition = null ) {
  if (empty( $tb )) $tb = $this->table;
  else $this->table=$tb;
   
  $sql = "select count(*) as c from `$tb`";
   
  if( isset($condition) ) $sql.=" where $condition";

  return $this->get_result_rows($sql);
 }
 
 /**
  * 返回sql查询结果
  * @param string $sql sql语句
  *
  * @return #id 
  */
 function get_result( $sql ){
  $result = @mysql_query( $sql , $this->conn );
  if(!$result) $this->error = 2;
  else return $result;
 }
 
 /**
  * 获取查询的结果
  * @param string $sql
  * 
  * @return array 结果的二维数组
  */
 function get_result_rows( $sql ){
  $array = array() ;
  $result = $this->get_result( $sql );
  while( $row = @mysql_fetch_assoc( $result ) )
  $array[] = $row ;
  return $array;
 }
 

 //获取一个二维数据表,以一个字体为一维下标
 //$id 默认做下标的字段
 function get_result_id( $sql, $id='id' ) {
$arr = $this->get_result_rows( $sql );
$arr2 = array();
for($i=0; $i<count($arr); $i++){
$j = $arr[$i][$id];
$arr2[$j] = $arr[$i];
}
return $arr2;
 }
 
 /**
  * 获取部分查询结果
  * 
  * @param Array 数组
  * @return Array 
  */
 function get_query_result( $cols , $tb=null , $condition=null , $order=null , $limit=null , $start=0 ) {
  if( empty($tb) ) $tb=$this->table;
  else $this->table=$tb;
  if( @is_array($cols) ) $col="`".implode('`,`',$cols)."`";
  else $col = $cols;

  $sql = "select $col from `$tb`";
  if( isset($condition) ) $sql.=" where $condition";
  if( isset($order) ) $sql.=" order by $order";
  if( isset($limit) ) $sql.=" limit $start,$limit";

  return $this->get_result_rows($sql);
 }

 /**
  * 执行数据库插入操作
  * 
  * @param $sql作表
  */
 function insert_info( $sql ) {
  return $this->get_result( $sql );
 }
 
 /**
  * 执行数据库更新操作
  * 
  * @param array $sql
  */
 function update_info( $sql ) {
  return $this->get_result( $sql );  
 }
 
}

数据库SQL:
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- 数据库: `mystr`
--

-- --------------------------------------------------------

--
-- 表的结构 `str_news_categories`
--

CREATE TABLE `str_news_categories` (
  `id` smallint(5) unsigned NOT NULL auto_increment,
  `parent_id` smallint(5) NOT NULL default '0',
  `cate_name` varchar(50) character set utf8 NOT NULL,
  `sort_order` smallint(4) NOT NULL default '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

--
-- 导出表中的数据 `str_news_categories`
--

INSERT INTO `str_news_categories` (`id`, `parent_id`, `cate_name`, `sort_order`) VALUES
(1, 0, '热点新闻', 1),
(2, 0, '娱乐新闻', 1),
(3, 0, '企业新闻', 1),
(4, 0, 'IT新闻', 1),
(5, 3, '私企新闻', 2),
(6, 3, '行业新闻', 1),
(7, 6, '大磊', 1);




写的递归函数:

function get_tree($table,$parent_id=0,$level=1){
global $db; global $tpf;global $smarty;
$sql= "SELECT id,cate_name as name FROM `{$tpf}$table` WHERE `parent_id`=$parent_id ORDER BY id DESC";
$res = $db->get_result_rows($sql); //取得一记录以二维数组返回 $arr[0]['id']'$arr[1]['name']
static $arr = array();
foreach($res as $key=>$rows){
$arr[$key]['id'] = $rows['id'];
$arr[$key]['name'] = $rows['name'];
$arr[$key]['level'] = $level;
get_tree($table,$rows['id'],$level+1);
}
return $arr;
}
$c = get_tree("str_news_categories");
print_r($c);

作者: kinghong24   发布时间: 2011-02-16

function get_tree($table,$parent_id=0,$level=1){
global $db; global $tpf;global $smarty;
$sql= "SELECT id,cate_name as name FROM `{$tpf}$table` WHERE `parent_id`=$parent_id ORDER BY id DESC";
$res = $db->get_result_rows($sql); //取得一记录以二维数组返回 $arr[0]['id']'$arr[1]['name']
$arr = array();
foreach($res as $key=>$rows){
$arr[$key]['id'] = $rows['id'];
$arr[$key]['name'] = $rows['name'];
$arr[$key]['level'] = $level;
$arr[$key]['child']=get_tree($table,$rows['id'],$level+1);
}
return $arr;
}
$c = get_tree("str_news_categories");
print_r($c);

作者: dingsongtao   发布时间: 2011-02-16