> 現在我們先來一個無限極分類的函數。我們在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;
}
}