2013-09-22 40 views
0

我的代码如下:如何将这些如果else语句重构为一个函数

$arr1 = array(); 
$arr2 = array(); 

// [...] some code 

$field_name = 'foo'; 
if (isset($arr1[$field_name])) { 
    $arr1[$field_name]++; 
} else { 
    $arr1[$field_name] = 1; 
} 

$another_field_name = 'bar'; 
if (isset($arr2[$another_field_name])) { 
    $arr2[$another_field_name]++; 
} else { 
    $arr2[$another_field_name] = 1; 
} 

还有更多的阵列和相同ifelse语句。

我想重构这些语句的功能:

function ifelse_arr ($arr_name, $field_name) { 
    if (isset($arr_name[$field_name])) { 
     $arr_name[$field_name]++; 
    } else { 
     $arr_name[$field_name] = 1; 
    } 
} 

但我怎么能传递一个数组名和字段名作为变量的函数?

+1

看起来更像你应该重构它使用循环,和一个字段名称数组。 – meagar

+0

不要传递数组名称,将参数传递给数组。 –

回答

1

你不想传递数组或变量名,你想传递数组和变量本身。

function ppIfIsset(array &$array, $field) { 
    $array[$field] = isset($array[$field]) ? $array[$field] + 1 : 1;  
} 

,并调用它像

ppIfIsset($arr1, 'foo'); 

之前函数参数使用&告诉,这个变量将被reference

0

你可以考虑把阵列到父数组传递

$parent = array(
    'arr_name1' => array(..), 
    'arr_name2' => array(..), 
); 

然后你可以通过数组名称的函数和做$parent[$arr_name][$field_name]

或者,您可以通过引用传递数组到函数(前缀函数arg与&)。这将使您对该函数中的$arr_name所做的更改也会更改原始数组。

0

我建议你在递增之前用0初始化所有使用的数组键。我这样做,只是总是这样的:

$arr1 += [$field_name => 0]; 

如果$ ARR1具有关键“$ FIELD_NAME”,那么它将停留不动,在其他的方式,将其设置为0。然后你可以增加它。