> 现在我们先来一个无限极分类的函数。我们在Application下新建一个Cate/Model目录,把它写在Model目录中。
作为调试我们先不用把Thinkphp的类库放到base.php或者是Common.php中,CateModel.php中我们封装底层php函数,在Controller.php写业务代码。
我们来引用一个think\db\query->order函数,看看他是怎么写的
> /**
> * 指定排序 order('id','desc') 或者 order(['id'=>'desc','create_time'=>'desc'])
> * @access public
> * @param string|array $field 排序字段
> * @param string $order 排序
> * @return $this
> */
> public function order($field, $order = null)
> {
> if (!empty($field)) {
> if (is_string($field)) {
> if (!empty($this->options['via'])) {
> $field = $this->options['via'] . '.' . $field;
> }
> $field = empty($order) ? $field : [$field => $order];
> } elseif (!empty($this->options['via'])) {
> foreach ($field as $key => $val) {
> if (is_numeric($key)) {
> $field[$key] = $this->options['via'] . '.' . $val;
> } else {
> $field[$this->options['via'] . '.' . $key] = $val;
> unset($field[$key]);
> }
> }
> }
> if (!isset($this->options['order'])) {
> $this->options['order'] = [];
> }
> if (is_array($field)) {
> $this->options['order'] = array_merge($this->options['order'], $field);
> } else {
> $this->options['order'][] = $field;
> }
> }
> return $this;
> }
然后我们发现这个order函数是能用mysql的查询方法。没有办法显示我们更高的逼格的排序算法,后台将就着先用。
<?php
namespace app\admin\Model;
use think\Model;
class Cate extends Model
{
/**
* 逆序读取id
* @return [type] [description]
*/
public function cateTree()
{
$data = $this->order('id desc')->select();
return $this->reSort( $data);
}
/**
* 将数组分化成树
* @param [type] $data 传入的链接
* @param integer $pid 父类id
* @param integer $level 树层级
* @return [array] cate树
*/
public function reSort($data, $pid = 0, $level = 0){
static $listTree = array();
foreach( $data as $key => $value) {
if( $value['pid'] == $pid) {
$value['level'] = $level;
$listTree[] = $value;
unset( $data[$key]);
$this->reSort( $data, $value['id'], $level+1);
}
}
return $listTree;
}
/**
* 取得父节点的children
*/
public function getChildId( $cates, $cateid) {
static $list = array();
foreach( $cates as $key => $value) {
if ( $value['id'] == $cateid) {
$listTree = $value['id'];
$this->getChildId( $cates, $value['id']);
}
}
return $list;
}
}