2013-08-14 4 views
0

У меня есть функция, которая уменьшит (оптимизирует) количество строк кода, которое у этого есть. Эта функция имеет несколько фрагментов, которые повторяются.Код функции уменьшения с лямбда-функцией

Может ли уменьшить этот код с помощью лямбда-функции?

Это мой код функции:

static function get_all_category_with_widgets($status = 'all') { 
      $all_categories = SB_Central::get_categories(); 
      $all_widgets = SB_Settings::get_sb_widgets(); // Get all widgets from options variable. 

      foreach ($all_categories as $category_key => $category_value) { 
       foreach ($all_widgets as $widget_value) { 
        // Create one widget 
        $widget = array_merge($widget_value['widget'], array ('id' => $widget_value['id'], 'status' => $widget_value['status'])); 

        // In this case save active and disable. 
        if ($status == 'active_and_disable' && ($widget_value['status'] == 'active' || $widget_value['status'] == 'disable')) { 
         if ($category_value[ 'category_title' ] == $widget_value[ 'category' ][ 'title' ]) { 
          $all_categories[ $category_key ][ 'widgets' ][ ] = $widget; // Save widget 
         } 
        } elseif ($status == 'active' && $widget_value['status'] == 'active') { 
         if ($category_value[ 'category_title' ] == $widget_value[ 'category' ][ 'title' ]) { 
          $all_categories[ $category_key ][ 'widgets' ][ ] = $widget; // Save widget 
         } 
        } elseif ($status == 'disable' && $widget_value['status'] == 'disable') { 
         if ($category_value[ 'category_title' ] == $widget_value[ 'category' ][ 'title' ]) { 
          $all_categories[ $category_key ][ 'widgets' ][ ] = $widget; // Save widget 
         } 
        } elseif ($status == 'deleted' && $widget_value['status'] == 'deleted') { 
         if ($category_value[ 'category_title' ] == $widget_value[ 'category' ][ 'title' ]) { 
          $all_categories[ $category_key ][ 'widgets' ][ ] = $widget; // Save widget 
         } 
        } elseif ($status == 'all') { 
         if ($category_value[ 'category_title' ] == $widget_value[ 'category' ][ 'title' ]) { 
          $all_categories[ $category_key ][ 'widgets' ][ ] = $widget; // Save widget 
         } 
        } 
       } 
      } 

      return $all_categories; 
     } 

И это код, который всегда у меня есть повторение:

if ($category_value[ 'category_title' ] == $widget_value[ 'category' ][ 'title' ]) { 
          $all_categories[ $category_key ][ 'widgets' ][ ] = $widget; // Save widget 
         } 

Если вы знаете лучший способ уменьшить этот код будет приветствоваться.

+0

Все, что 'IF' могут все быть сгруппированы в один IF заявление. –

+0

Пожалуйста, объясните, почему вы думаете, что «меньшее количество строк» ​​всегда коррелирует с «оптимизацией». –

+1

@lightness Racess, Создается впечатление, что у меня есть несколько повторяющихся утверждений, что с другой точки зрения я могу уменьшить количество строк. Возможно, я хорошо интерпретировал, но я хочу увидеть возможность уменьшения количества строк, если это возможно. Спасибо за все. –

ответ

1

можно заменить, если/ElseIf/ElseIf .... блок со следующим представлением более краткий

if ($category_value[ 'category_title' ] == $widget_value[ 'category' ][ 'title' ]) { 
    switch ($status){ 
     case "active_and_disable": 
      // set if widget statis is active or disable 
      if($widget_value['status'] == 'active' || $widget_value['status'] == 'disable'){ 
       $all_categories[ $category_key ][ 'widgets' ][ ] = $widget; // Save widget 
      } 
      break; 
     case "all": 
      // always set 
      $all_categories[ $category_key ][ 'widgets' ][ ] = $widget; // Save widget 
      break; 
     default: 
      // set when status == widget status 
      if ($status == $widget_value['status']){ 
       $all_categories[ $category_key ][ 'widgets' ][ ] = $widget; // Save widget 
      } 
      break; 
    } 
}