Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在多维php数组中求和值_Php_Arrays_Math_Multidimensional Array_Divide - Fatal编程技术网

在多维php数组中求和值

在多维php数组中求和值,php,arrays,math,multidimensional-array,divide,Php,Arrays,Math,Multidimensional Array,Divide,我试图找出如何处理数组,以便对其值进行“计算”。 该阵列看起来与此类似: Array ( [0] => Array ( [person1] => 71 [person2] => 49 [person3] => 15 ) [1] => Array ( [person1] => 56 [person3] => 43 [person4] =

我试图找出如何处理数组,以便对其值进行“计算”。 该阵列看起来与此类似:

Array
(
[0] => Array
    (
        [person1] => 71
        [person2] => 49
        [person3] => 15
    )

[1] => Array
    (
        [person1] => 56
        [person3] => 43
        [person4] => 21
        [person5] => 9
        [person6] => 7
    )

...

)
每个值应除以总金额: 因此,第一个值应为71/(71+49+15)=0.526或52.6%

数值应四舍五入至小数点后3位。有人能为我提供一个array_walk(或foreach)函数吗?我就是搞不懂

最后一个数组应该如下所示:

Array
(
[0] => Array
    (
        [person1] => 52.6%
        [person2] => 36.3%
        [person3] => 11.1%
    )

[1] => Array
    (
        [person1] => 41.2%
        [person3] => 31.6%
        [person4] => 15.4%
        [person5] => 6.6%
        [person6] => 5.1%
    )

...

)
谢谢

您可以使用将这些值相加,然后计算每个值的比率/百分比,并添加到新数组中:

$output = array();

foreach($array as $key => $current) {
    $total = array_sum($current);
    $output[$key] = array();

    foreach($current as $person => $value) {
        // decimal: round to 3 places
        $output[$key][$person] = round($value / $total, 3); 
        // if you want a percentage, round to another 1 place (as per your example):
        // $output[$key][$person] = round($output[$key][$person] * 100, 1) . '%';
    }
}
编辑:

数组_walk()变体:

$data = array(
    array(
        'person1' => 71,
        'person2' => 49,
        'person3' => 15,
    ),
    array(
        'person1' => 56,
        'person3' => 43,
        'person4' => 21,
        'person5' => 9,
        'person6' => 7,
    ),
);

array_walk(
    $data,
    function (&$value) {
        $sum = array_sum($value);
        array_walk(
            $value,
            function (&$value) use ($sum) {
                $value = round($value / $sum, 3) * 100 . '%';
            }
        );
    }
);
var_dump($data);

请注意,array_walk()修改了原始数组;如果希望保持不变,请改用array_map()

假设
$arr
是您的初始数组,而
$new_arr
将是新数组

$new_arr = array();
foreach ($arr as $i=>$ar)
    foreach ($ar as $j=>$a)
        $new_arr[$i][$j] = round(($a/array_sum($ar))*100, 1);

愿意分享你尝试过的东西吗?此外,您说“四舍五入到小数点后3位”,但您的示例显示小数点后1位。到底应该是哪一个?@JayBlanchard:他们想要的结果百分比的小数点后一位。太棒了@(尸体)是的,百分比的小数点后一位。我尝试将
foreach($k=>v)与
array\u sum()
结合使用,但实际效果并不理想。我不知道如何获取第二维度的值并重新计算它们