2016-01-22 82 views
0

我有以下功能避免不确定的偏移误差

function getSum($array){ 
    if(is_array($array)) { 
     $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array)); 
     $sum = 0; 
     foreach ($iterator as $key => $value) { 
      $sum += $value; 
     } 
    } else{ 
     $sum = $array; 
    } 
    return $sum; 
} 

而且我使用它像这样

$teams = array(); 
$teams[1]['AREA I']['blue'] = 30; 
$teams[1]['AREA I']['green'] = 25; 
$teams[1]['AREA II']['blue'] = 15; 
$teams[2]['AREA I']['blue'] = 40; 

echo getSum($teams); //output: 110 
echo getSum($teams[1]); //output: 70 
echo getSum($teams[1]['AREA I']); //output: 55 
echo getSum($teams[1]['AREA I']['blue']); //output: 30 

如何避免错误未定义偏移使用像getSum($teams[2]['AREA IV'](关键领域IV不是当组)?在这种情况下,我希望该函数返回零。

+1

添加一个检查,如果offset设置与否。视情况而定'isset'或'empty'。 –

+1

要添加到@Sougata所说的内容中,可以使用''trim'](http://php.net/manual/en/function.trim.php)和'empty'。 – Script47

+1

[未定义的偏移PHP错误]的可能重复(http://stackoverflow.com/questions/2508215/undefined-offset-php-error) –

回答

1

由于错误发生在调用getSum函数之前,因此您无法更改该函数以使其可行。

但是,如果您愿意更改传递给getSum的参数,则可以解决该问题。您可以传递数组而不需要其他键规范(以避免潜在错误)并将键指定为第二个参数。然后把它留给getSum试图让该值如果它存在,就像这样:

function getSum($array, $path = array()){ 
    // process second argument: 
    foreach ($path as $key) { 
     if (!is_array($array) || !isset($array[$key])) { 
      return 0; // key does not exist, return 0 
     } 
     $array = $array[$key]; 
    } 
    if(is_array($array)) { 
     $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array)); 
     $sum = 0; 
     foreach ($iterator as $key => $value) { 
      $sum += $value; 
     } 
    } else{ 
     $sum = $array; 
    } 
    return $sum; 
} 

$teams = array(); 
$teams[1]['AREA I']['blue'] = 30; 
$teams[1]['AREA I']['green'] = 25; 
$teams[1]['AREA II']['blue'] = 15; 
$teams[2]['AREA I']['blue'] = 40; 

// pass an optional 2nd argument:  
echo getSum($teams); //output: 110 
echo getSum($teams, [1]); //output: 70 
echo getSum($teams, [1,'AREA I']); //output: 55 
echo getSum($teams, [1,'AREA I','blue']); //output: 30 
echo getSum($teams, [2, 'AREA IV']); // no error, output: 0 
+0

感谢您的丰富答案!它的工作完美。 – lingo

+0

不客气。 – trincot