2009-12-06 3 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-reference и variable functions факторизовать часть в средний. Может уменьшить дублирование, но может или не может считаться «упрощающим».

EDIT Вот что я имею в виду. Этот код не проверен.

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

Почему бы не передать параметры в вашу функцию и не поместить их в методы «где» и «получить»?

+0

Вы заметите, где/get не меняются. Он только меняет способ сохранения данных в массив/хеш. Это намного усложняет фактор. –

0

Я не знаю, как выглядят ваши классы db и query, но я бы начал их улучшать. Добавить «выборки массива» и «хэш выборки» функции для класса запросов:

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; 
     } 

Make «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(); 
}