2009-12-06 44 views
1

我有以下PHP模型函数。 我知道我在重复自己。我该如何简化这个PHP?

有反正我可以简化这段代码吗?

function getTopMenus(){ 
    $data[0] = 'root'; 
    $this->db->where('parentid',0); 
    $Q = $this->db->get('menus'); 
    if ($Q->num_rows() > 0){ 
     foreach ($Q->result_array() as $row){ 
     $data[$row['id']] = $row['name']; 
     } 
    } 
    $Q->free_result(); 
    return $data; 
} 

function getheadMenus(){ 
    $this->db->where('parentid',0); 
    $Q = $this->db->get('menus'); 
    if ($Q->num_rows() > 0){ 
     foreach ($Q->result_array() as $row){ 
     $data[] = $row; 
     } 
    } 
    $Q->free_result(); 
    return $data; 
} 
function getrootMenus(){ 
    $this->db->where('parentid',0); 
    $Q = $this->db->get('menus'); 
    if ($Q->num_rows() > 0){ 
     foreach ($Q->result_array() as $row){ 
      $data[$row['id']] = $row['name']; 
     } 
    } 
    $Q->free_result(); 
    return $data; 
} 

回答

3

我可以看到一个简化你可以尝试使用传址参考因素东西出来成一个函数:

function prepareMenu(&$data) { 
    $this->db->where('parentid',0); 
    $Q = $this->db->get('menus'); 
    if ($Q->num_rows() > 0){ 
     foreach ($Q->result_array() as $row){ 
      $data[$row['id']] = $row['name']; 
     } 
    } 
    $Q->free_result(); 
} 

function getTopMenus() { 
    $data[0] = 'root'; 
    prepareMenus($data); 
    return $data; 
} 

function getRootMenus() { 
    prepareMenus($data); 
    return $data; 
} 

还有使用pass-by-referencevariable functions分解出的部分的可能性中间。可以减少重复,但可能会或可能不会被认为是“简化”。

编辑这就是我的意思。此代码未经测试。

function getMenus(&$data, $appendFunc) { 
    $this->db->where('parentid',0); 
    $Q = $this->db->get('menus'); 
    if ($Q->num_rows() > 0){ 
     foreach ($Q->result_array() as $row){ 
     $appendFunc(&$data, $row); 
     } 
    } 
    $Q->free_result(); 
} 

function appendTopMenu(&$data, $row) { 
    $data[$row['id']] = $row['name']; 
} 

function appendHeadMenu(&$data, $row) { 
    $data[] = $row; 
} 

function getTopMenus() { 
    $data[0] = 'root'; 
    getMenus($data, "appendTopMenu"); 
    return $data; 
} 

function getheadMenus() { 
    getMenus($data, "appendHeadMenu"); 
    return $data; 
} 

function getrootMenus() { 
    getMenus($data, "appendTopMenu"); 
    return $data; 
} 
0

为什么不传递参数到你的函数中,并把它们放在'where'和'get'方法中?

+0

你会注意到哪里/哪里不改变。他只是在改变数据如何保存到数组/散列中。这使得分解困难得多。 – 2009-12-06 12:05:12

0

我不知道你的数据库和查询类是什么样的,但我会开始改进这些。添加“数组提取”和“散列取”功能,查询类:

class Query ... 

     function as_array() { 
      $data = array(); 
      if($this->num_rows() > 0) 
      foreach ($this->result_array() as $row) 
       $data[] = $row; 
      $this->free_result(); 
      return $data; 
     } 
     function as_hash($key = 'id') { 
      $data = array(); 
      if($this->num_rows() > 0) 
      foreach ($this->result_array() as $row) 
       $data[$row[$key]] = $row; 
      $this->free_result(); 
      return $data; 
     } 

使'DB->其中()返回其自身

 class DB 
      function where(...) { 
       stuff 
       return $this; 

一旦你有了这个,你的客户端功能变得微不足道:

function getTopMenus() { 
    $data = $this->db->where('parentid',0)->get('menus')->as_hash(); 
    $data[0] = 'root'; 
    return $data; 
} 

function getheadMenus() { 
    return $this->db->where('parentid',0)->get('menus')->as_array(); 
} 

function getrootMenus() { 
    return $this->db->where('parentid',0)->get('menus')->as_hash(); 
}