多维数组和值

时间:2016-03-08 08:46:21

标签: php arrays recursion multidimensional-array

我有以下函数来对多维数组值求和。

// summing values of multidimensional array
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;
}

我正在使用这样的功能:

$array = array();
$array['one']['green'][20] = 20;
$array['one']['blue'][20] = 5;
$array['one']['blue'][30] = 10;

getSum($array,['one','green']); // 20
getSum($array,['one','blue',20]); // 5

现在我有一个问题,如果我不想设置任何特殊颜色,因为我希望该脚本将所有颜色的类别20中的所有值相加。

所以它应该像这样工作:

getSum($array,['one','*',20]); // 25

感谢您的帮助!

这是我的数组的例子:

Array ( 
    [1] => Array ( 
        [AREA I] => Array (
            [20] => 1 
            [25] => 0 
            [30] => 0 ) 
        [AREA II] => Array ( 
            [20] => 0 
            [30] => 0 ) 
        [AREA III] => Array ( 
            [20] => 2 
            [30] => 0 ) 
        [AREA IV] => Array ( 
            [20] => 0 
            [30] => 3 ) 
        [AREA V] => Array ( 
            [20] => 4 
            [25] => 0 
            [30] => 3 )  
    ) 
    [2] => Array ( 
        [AREA I] => Array ( 
            [20] => 0 
            [30] => 0 ) 
        [AREA II] => Array ( 
            [20] => 0 
            [30] => 0 ) 
    )
)

以下是我getSum电话的示例:

getSum($visitsandinfosact,['*','*',20]); // should print 7

2 个答案:

答案 0 :(得分:1)

递归函数

我不确定['one','*']是否应该给出45,但如果它应该返回0,则只需删除else if (empty($filterList) && is_array($value) && $first == "*")条件。所有非数组的值都只是通过intval转换为int并添加到总和中。如果您想使用float,请使用floatval代替intval

function getSum($array, $filterList = array('*')) {
    $sum = 0;
    $first = array_shift($filterList);
    foreach ($array as $key => $value) {
        if ($key == $first || $first == "*") {
            if (is_array($value) && !empty($filterList)) {
                $sum += getSum($value, $filterList);
            } else if (empty($filterList) && is_array($value)) {
                $sum += getSum($value, array("*"));
            } else if (empty($filterList)) {
                $sum += intval($value);
            }
        }
    }
    return $sum;
}

echo getSum($array,['one','*',20], 10) . "\n"; // 25
echo getSum($array,['one','*','*',20]) . "\n"; // 10
echo getSum($array,['one','*']) . "\n"; // 45
echo getSum($array) . "\n"; // 45

输入数组

$array = array();
$array['one'] = array();
$array['one']['green'] = array();
$array['one']['green'][20] = 20;
$array['one']['blue'] = array();
$array['one']['blue'][20] = 5;
$array['one']['blue'][30] = 10;
$array['one']['orange']['red'][20] = 10;

输出

仅输出数字,但只是添加输入参数以便更好地理解。

25 // (['one','*',20])
10 // (['one','*','*',20])
45 // (['one','*'])
45 // no filterList

答案 1 :(得分:-1)

简而言之,您需要一个递归函数来添加通配符“端点”。您也可以使用相同的递归性质来覆盖添加。

以下应该做你想要的:

// summing values of multidimensional array
function getSum(&$array, $path = array()){
    $sum = 0;
    if(is_int($array) and empty($path)) // return value if int
        $sum = $array;
    else if(is_array($array)){ // else add recurred values
        if(empty($path)){
            foreach($array as $value)
                $sum += getSum($value);
        } else {
            $key = array_shift($path);
            if($key=='*'){
                foreach($array as $value)
                    $sum += getSum($value, $path);
            } else {
                if(isset($array[$key]))
                    $sum += getSum($array[$key], $path);
            }
        }
    }
    return $sum;
}

测试:

$array['one'] = array();
$array['one']['green'] = array();
$array['one']['green'][20] = 20;
$array['one']['blue'] = array();
$array['one']['blue'][20] = 5;
$array['one']['blue'][30] = 10;
$array['one']['orange']['red'][20] = 10;

echo getSum($array,['one','*',20]); // 25
echo getSum($array,['one','*','*',20]); // 10
echo getSum($array,['one','*']); // 45

快乐编码