当前位置: 首页 > 图文教程 > 网络编程 > PHP > php:树形结构的算法 4

PHP
用PHP实现Ftp用户的在线管理
用PHP实现分段下载
最令PHP初学者头痛的十四个问题
用PHP写的MD5加密函数
PHP应用程序加速探索之简介
将SSH与PHP相连接 确保传输数据的安全
PHP制作的仿百度的站内搜索引擎代码
PHP读取汉字点阵数据
PHP实现任意字符集下正常显示网页的方法
利用PHP的OOP特性实现数据保护
关于PHP字符集的问题
新手入门:IIS6环境下的PHP最佳配置方法
新手入门:初学动态网页PHP的18个例子
基于PHP的AJAX技术实现文件异步上传
PHP技巧--通过COM使用ADODB
PHP技巧:正确理解PHP程序编译时的错误信息
PHP技巧:分析利用PHP制作新闻系统的步骤
PHP技巧:通过实例深入剖析require和include的用法
PHP技巧:优化动态网页技术PHP程序的12条技巧
PHP技巧:使用APC缓存优化PHP程序

PHP 中的 php:树形结构的算法 4


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 66 ::
收藏到网摘: n/a

  <?php
  /**
  * 显示列表
  * @access public
  */
  function DispList()
  {
  //不缩进的显示方式
  // $this->mIsDispListIndex = true;
  // echo('<p align="right"><a href="?action=new&part=role">增加新角色</a>  </p>'); _fcksavedurl=""?action=new&part=role">增加新角色</a>  </p>');"
  //
  // $this->mListTitle = '用户角色列表';
  // $this->SetDataOption('list');
  //
  // $this->SetQueryTable( array($this->mTableUserRole) );
  //
  // //查询顺序
  // $this->SetQueryOrder( 'asc', $this->mTableUserRole, 'sequence' );
  //
  // $this->Query('list');
  // parent::DispList();
  
  // //另外一种显示方式,用数组作为堆栈,A: 压栈时存role,压完就删除source
  // $this->CheckProperty('mrDb');
  // $this->CheckProperty('mrSql');
  // $this->mrSql->Select('role, title, parent');
  // $this->mrSql->From($this->mTableUserRole);
  // $this->mrSql->Orderby('parent, sequence');
  // $this->mRs = $this->mrDb->Execute($this->mrSql->Sql());
  // if (0 < count($this->mRs))
  // {
  // $source = & $this->mRs->GetArray(); //数字索引
  // $stack = array(''); //堆栈
  // $stacki = array(-1); //和堆栈对应,记录堆栈中数据在树中的层次
  // $target = array();
  // while (0 < count($stack))
  // {
  // $item = array_shift($stack);
  // $lev = array_shift($stacki);
  // if (!empty($item))
  // {
  // //在这里把加工过的数据放到target数组
  // array_push($target, str_repeat(' ', $lev) . $item);
  // //$s1 = str_repeat(' ', $lev) . $item;
  // }
  // $del = array(); //要从$source中删除的节点
  // $ar = array(); //需要添加到堆栈中的节点
  // foreach ($source as $key=>$val)
  // {
  // //寻找匹配的子节点
  // if (empty($item))
  // {
  // $find = empty($source[$key]['parent']);
  // }
  // else
  // {
  // $find = ($item == $source[$key]['parent']);
  // }
  // if ($find)
  // {
  // array_unshift($ar, $source[$key]['role']);
  // $del[] = $key;
  // }
  // }
  // foreach ($ar as $val)
  // {
  // array_unshift($stack, $val);
  // array_unshift($stacki, $lev + 1);
  // }
  // foreach ($del as $val)
  // {
  // unset($source[$val]);
  // }
  // echo(implode(', ', $stack) . '<br />' . implode(', ', $stacki) . '<br />' . implode(', ', $target) . '<br /><br />');
  // }
  // debug_array();
  // }
  // else
  // {
  // echo('<center>没有检索到数据</center>');
  // }
  
  //另外一种显示方式,用数组作为堆栈,B: 压栈时存数组索引,出栈并使用完后再删除source
  $this->CheckProperty('mrDb');
  $this->CheckProperty('mrSql');
  $this->mrSql->Select('role, title, parent');
  $this->mrSql->From($this->mTableUserRole);
  $this->mrSql->Orderby('parent, sequence');
  $this->mRs = $this->mrDb->Execute($this->mrSql->Sql());
  if (!empty($this->mRs) && !$this->mRs->EOF)
  {
  $source = & $this->mRs->GetArray(); //数字索引
  $stack = array(-1); //堆栈
  $stacki = array(-1); //和堆栈对应,记录堆栈中数据在树中的层次
  $target = array();
  while (0 < count($stack))
  {
  $item = array_shift($stack);
  $lev = array_shift($stacki);
  if (-1 != $item)
  {
  //在这里把加工过的数据放到target数组
  $s1 = str_repeat(' ', $lev) . '<a href="?action=disp&part=role&role=' . $source[$item]['role'] . '">' . $source[$item]['title'] . '</a>';
  $s2 = '<a href="?action=edit&part=role&role=' . $source[$item]['role'] . '">编辑</a> <a href="?action=delete&part=role&role=' . $source[$item]['role'] . '">删除</a>';
  array_push($target, array($s1, $s2));
  }
  $del = array(); //要从$source中删除的节点
  $ar = array(); //需要添加到堆栈中的节点
  foreach ($source as $key=>$val)
  {
  //寻找匹配的子节点
  if (-1 == $item)
  {
  $find = empty($source[$key]['parent']);
  }
  else
  {
  $find = ($source[$item]['role'] == $source[$key]['parent']);
  }
  if ($find)
  {
  array_unshift($ar, $key);
  }
  }
  foreach ($ar as $val)
  {
  array_unshift($stack, $val);
  array_unshift($stacki, $lev + 1);
  }
  //从source中删除
  unset($source[$item]);
  //echo(implode(', ', $stack) . '<br />' . implode(', ', $stacki) . '<br />' . implode(', ', $target) . '<br /><br />');
  }
  //输出
  echo('<p align="right"><a href="?action=new&part=role">增加新角色</a>  </p>');
  array_unshift($target, array('角色', '操作'));
  $this->CheckProperty('mrLt');
  $this->mrLt->SetData($target);
  $this->mrLt->mListTitle = '用户角色列表';
  $this->mrLt->mIsDispIndex = false;
  $this->mrLt->Disp();
  }
  else
  {
  echo('<center>没有检索到数据</center>');
  }
  } // end of function DispList
  ?>