简体   繁体   English

如何平均来自多个平坦 arrays 的数据列?

[英]How to average columns of data from multiple, flat arrays?

Let's say I have 4 arrays with the same amount of values in each:假设我有 4 个 arrays ,每个值的数量相同:

$array1 = array(0, 7, 5, 0);
$array2 = array(2, 6, 10, 0);
$array3 = array(4, 8, 15, 10);
$array4 = array(6, 7, 20, 10);

I want to count the average for all 4 of these arrays for each index.我想计算每个索引的所有 4 个 arrays 的平均值。 So I should get something like this:所以我应该得到这样的东西:

array(3, 7, 12.5, 5);

For more dynamically usage lets say for example 6 arrays or more, you can use this code:对于更动态的用法,例如 6 arrays 或更多,您可以使用以下代码:

$all_arrays = [
    array(0, 7, 5, 0),
    array(2, 6, 10, 0),
    array(4, 8, 15, 10),
    array(6, 7, 20, 10),
    array(1, 2, 3, 4),
    array(5, 6, 7, 8),
    // more arrays
];

$each_array_count = count($all_arrays[0]); // 4
$all_arrays_count = count($all_arrays); // 6

$output = [];

for ($i = 0; $i < $each_array_count; $i++) {
    for ($j=0; $j < $all_arrays_count; $j++) { 
        $output[$i] += $all_arrays[$j][$i] / $all_arrays_count;        
    }
}

echo "<pre>";
var_dump($output);

Output: ( Demo ) Output:(演示

Warning: Undefined array key 0 in /in/E783F on line 20

Warning: Undefined array key 1 in /in/E783F on line 20

Warning: Undefined array key 2 in /in/E783F on line 20

Warning: Undefined array key 3 in /in/E783F on line 20
<pre>array(4) {
  [0]=>
  float(3)
  [1]=>
  float(6)
  [2]=>
  float(10)
  [3]=>
  float(5.333333333333333)
}

Here is a simple solution but you can generalize it further and make it generic but it will work for now.这是一个简单的解决方案,但您可以进一步概括它并使其通用,但它现在可以工作。 It can be updated accordingly:它可以相应地更新:

NOTE: Assuming the count of array are same as you have mentioned注意:假设数组的数量与您提到的相同

     $result = [];
     for ($i = 0; $i < count($array1); $i++) {
         $result [] = ($array1[$i] + $array2[$i] + $array3[$i] + $array4[$i]) / count($array1);
     }
     dd($result);

Fully Dynamic Function:全动态 Function:

I took on the task of building a fully dynamic function where you can input as many arrays as you want.我承担了构建一个完全动态的 function 的任务,您可以在其中输入任意数量的 arrays。 I also added a null check as seen in the example below just in case you need to skip a value inside an array.我还添加了一个null检查,如下例所示,以防您需要跳过数组中的值。

Function: Function:

# The three dots (...) allow for ANY amount of
# arrays to be inputted into the function
# 
# Theoretically you can put 100 different arrays if you wanted
# e.g. arrayAverage($a1, $a2, $a3, $a4, $a5, $a6, ...etc)
function arrayAverage(...$array){

    # Add each of the values you want to average out into
    # separate temporary arrays for easy manageability.
    # For this instance, the first value of the 4 arrays 
    # will be added to its own array, then the second
    # value of the 4 arrays will be added to its own array,
    # and so on and so on...
    foreach($array as $arr){
        for($i = 0; $i < count($arr); $i++){
            if(!is_null($arr[$i])) $temparr[$i][] = $arr[$i];
        }
    }

    # Now we can get the average of each of those arrays we created 
    # and put them into the "$averages" array, to be returned at the end
    for($j = 0; $j < count($temparr); $j++){
        $averages[] = array_sum($temparr[$j]) / count($temparr[$j]);
    }

    # Returns the averages in said array
    return $averages;

}

Usage/Example:用法/示例:

# Arrays do NOT need the same number of values/keys as shown in "$array2"
$array1 = array(0, 7, 5, 0);
$array2 = array(2, 6, 10, 0, 100);
$array3 = array(4, 8, 15, 10);
$array4 = array(6, 7, 20, 10);

# Example on how to skip values just in case the need arises
# (So our averages won't be affected by having an extra number)
$array5 = array(null, null, null, null, 300);

$averages = arrayAverage($array1, $array2, $array3, $array4, $array5);
var_export($averages);

Output: Output:

[3, 7, 12.5, 5, 200]

Live Sandbox Demo:实时沙盒演示:

https://onlinephp.io/c/bb513 https://onlinephp.io/c/bb513

Another approach:另一种方法:

$arrays = [$array1, $array2, $array3, $array4];

$result = [];
for ($i = 0; $i < count($array1); $i++) {
    $result[] = array_sum(array_column($arrays, $i)) / count($arrays);
}

Working example .工作示例

For a sleek, functional-style snippet, use array_map() to "transpose" the rows of data.对于简洁的函数式片段,使用array_map()来“转置”数据行。 This means that columns of data will be passed to the custom function.这意味着数据列将传递给自定义 function。 From there, perform the averaging math.从那里,执行平均数学。

Code: ( Demo )代码:(演示

$array1 = [0, 7, 5, 0];
$array2 = [2, 6, 10, 0];
$array3 = [4, 8, 15, 10];
$array4 = [6, 7, 20, 10];

var_export(
    array_map(
        fn() => array_sum(func_get_args()) / func_num_args(),
        $array1,
        $array2,
        $array3,
        $array4
    )
);
// fn(...$col) => array_sum($col) / count($col), would also work

Output: Output:

array (
  0 => 3,
  1 => 7,
  2 => 12.5,
  3 => 5,
)

Note, this technique will fill gaps in the columns with null (counting as 0 ) when arrays are not all of the same length: Demo .请注意,当 arrays 的长度不同时,此技术将使用null (计为0 )填充列中的空白: Demo

If your input array was a single multi-dimensional array, you could use the spread operator to unpack it into array_map() .如果您的输入数组是单个多维数组,则可以使用扩展运算符将其解包到array_map()中。

var_export(array_map(fn() => array_sum(func_get_args()) / func_num_args(), ...$arrays));

To prevent null values from skewing the calculations, filter them before doing the math: Demo .为防止null值扭曲计算,请在进行数学运算之前对其进行过滤: Demo

var_export(
    array_map(
        fn(...$col) => array_sum($col) / count(array_filter($col, fn($v) => !is_null($v))),
        ...$arrays
    )
);
// or:  fn(...$col) => array_sum($col) / count(array_diff($col, ['']))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM