数组中n个元素组的PHP平均值

数组中n个元素组的PHP平均值,php,Php,我有一个数组,它是通过上传和读取excel文件创建的 创建阵列的脚本如下所示: $values = array(); for($i=1;$i<=$arrayCount;$i++){ $date = trim($allDataInSheet[$i]["A"]); $dir = trim($allDataInSheet[$i]["B"]); $sinvalue= sin(deg2rad($dir)); $cosvalue= cos(deg2rad($dir));

我有一个数组,它是通过上传和读取excel文件创建的

创建阵列的脚本如下所示:

$values = array();
for($i=1;$i<=$arrayCount;$i++){
    $date = trim($allDataInSheet[$i]["A"]);
    $dir = trim($allDataInSheet[$i]["B"]);
    $sinvalue= sin(deg2rad($dir));
    $cosvalue= cos(deg2rad($dir));            
    $values[] = "('$date', $sinvalue,$cosvalue)";
}

首先,您应该重新设计数据结构。您在
$values
中以字符串形式聚合值,然后很难提取和使用单个组件

$values = array();
for($i=1;$i<=$arrayCount;$i++){
    $date = trim($allDataInSheet[$i]["A"]);
    $dir = trim($allDataInSheet[$i]["B"]);
    $sinvalue= sin(deg2rad($dir));
    $cosvalue= cos(deg2rad($dir));            
    $values[] = array(
        'date' => $date,
        'sin'  => $sinvalue,
        'cos'  => $cosvalue,
    );
}
$values
中提取与
'sin'
相关的值,将列表分成5个项目的块,将函数
average()
应用于每个块。结果是一个包含288个值的列表

$avg288 = array_map(
    'average',
    array_chunk(
        array_column($values, 'sin'),
        5
    )
);
与上面类似,将288个平均值的列表拆分为24个12个值的块,对每个块应用
average()
,得到24个数字的列表

$avg24 = array_map(
    'average',
    array_chunk(
        $avg288,
        12
    )
);
阅读关于


更新

在PHP5.4上不起作用(因为它是在PHP5.5中引入的)

在这种情况下,您可以计算初始循环中由返回的数组,其中创建了
$values

$values = array();
$sins = array();
for($i=1;$i<=$arrayCount;$i++){
    $date = trim($allDataInSheet[$i]["A"]);
    $dir = trim($allDataInSheet[$i]["B"]);
    $sinvalue= sin(deg2rad($dir));
    $cosvalue= cos(deg2rad($dir));            
    $values[] = array(
        'date' => $date,
        'sin'  => $sinvalue,
        'cos'  => $cosvalue,
    );
    $sins[] = $sinvalue;
}
$values=array();
$sins=array();
对于($i=1;$i$日期,
'sin'=>$sinvalue,
'cos'=>$cosvalue,
);
$sins[]=$sinvalue;
}

在计算
$avg288

时,使用
$sins
代替
数组列($values,'sin')
,尽管Axiac的解决方案很好。在他发布之前,我已经开始研究我的解决方案。我访问了一个稍微不同的方法。我不使用
array\u map
array\u chunk

正如我在评论中解释的,我的主要问题是您的数据结构,特别是在代码中,您通过关联数组访问方向
$dir=trim($allDataInSheet[$i][“B”])

但是你提供给我们的数据显示了一个普通的索引数组
[1]=>('2018-01-23 00:01:00',-0.374606593415912,-0.9271838545667874)

因此
trim($allDataInSheet[$i][“B”])应返回“未定义索引”B”“。。无论如何…
以下是我的解决方案:

我循环遍历数组的所有元素,检查它是5还是12的模块。然后,我将当前索引传递给一个平均函数,该函数访问数组的下5/12个元素,并返回数组中的平均sin+cos

如果这不起作用,那是因为我上面提到的…
$allDataInSheet[$i][“B”]
应为
$allDataInSheet[$i][1]

<?php

$allDataInSheet = array();
$arrayCount = count($allDataInSheet);

$fiveGroup = array();
$twelveGroup = array();

//loop the array
for($i=1;$i<=$arrayCount;$i++){
    //modula function to see if group of 5
    if($i%5 === 0){
       $fiveGroup[] = calculateAverage($i,5,$allDataInSheet);
    //modula to see if group of 12
    }else if($i%12===0){
       $twelveGroup[] = calculateAverage($i,12,$allDataInSheet);
    }

}

//output the 5 grouped averages
print_r($fiveGroup);
//output the 12 grouped averages
print_r($twelveGroup);    


function calculateAverage($indexStart,$indexEnd,$array){
    //initilize the arrays
    $sinGroup = array();
    $cosGroup = array();

    //loop over elements
    for($i=1; $i<$indexEnd; $c++){
        //Assign the values to array
        $sinGroup[] = sin(deg2rad($array[$indexStart+$c]["B"]));
        $cosGroup[] = cos(deg2rad($array[$indexStart+$c]["B"]));
        //$sinGroup[] = sin(deg2rad($array[$indexStart+$c][1]));
        //$cosGroup[] = cos(deg2rad($array[$indexStart+$c][1]));
    }

    //work out the average
    $sinAverage = array_sum($sinGroup) / count($sinGroup);
    $cosAverage = array_sum($cosGroup) / count($cosGroup);

    //return the averages
    return array($sinAverage,$cosAverage);

}

最好提供一个数据外观的示例,而不是您如何制作的示例。另外,到目前为止您尝试了什么,遇到了什么问题?是
$allDataInSheet
0还是1中的第一个关键元素?它是1,因为1行是列标题
array\u chunk()
array\u sum(array\u column($array,1))
将帮助您提供的数据与
$allDataInSheet[$i][B]不太匹配
表示您有一个关联数组。这是否应该是
$allDataInSheet[$i][1]
?或
$allDataInSheet[$i][2]
?这两个值之间的意义是什么?因为据我所知,您在代码中只使用了其中一个值,并与sin/cost共享该值。代码显示数组映射中最后一个逗号的错误。如果我删除逗号,则没有输出comesI也尝试了$avg288=array\u映射(average(array\u chunk(array\u column($values,'sin'),5));调用
average(array\u chunk(…)
不起作用,因为它返回一个列表,而
average()
需要一个数字列表。我从代码中删除了逗号,现在可以使用了。但是,它不希望您的
$values
包含标题行(
array('date',0,1)
)。似乎array\u列不能像PHP版本那样工作是5.4在PHP5.4中的任何解决方法,因为我不是服务器管理员,所以升级很困难
$values = array();
$sins = array();
for($i=1;$i<=$arrayCount;$i++){
    $date = trim($allDataInSheet[$i]["A"]);
    $dir = trim($allDataInSheet[$i]["B"]);
    $sinvalue= sin(deg2rad($dir));
    $cosvalue= cos(deg2rad($dir));            
    $values[] = array(
        'date' => $date,
        'sin'  => $sinvalue,
        'cos'  => $cosvalue,
    );
    $sins[] = $sinvalue;
}
<?php

$allDataInSheet = array();
$arrayCount = count($allDataInSheet);

$fiveGroup = array();
$twelveGroup = array();

//loop the array
for($i=1;$i<=$arrayCount;$i++){
    //modula function to see if group of 5
    if($i%5 === 0){
       $fiveGroup[] = calculateAverage($i,5,$allDataInSheet);
    //modula to see if group of 12
    }else if($i%12===0){
       $twelveGroup[] = calculateAverage($i,12,$allDataInSheet);
    }

}

//output the 5 grouped averages
print_r($fiveGroup);
//output the 12 grouped averages
print_r($twelveGroup);    


function calculateAverage($indexStart,$indexEnd,$array){
    //initilize the arrays
    $sinGroup = array();
    $cosGroup = array();

    //loop over elements
    for($i=1; $i<$indexEnd; $c++){
        //Assign the values to array
        $sinGroup[] = sin(deg2rad($array[$indexStart+$c]["B"]));
        $cosGroup[] = cos(deg2rad($array[$indexStart+$c]["B"]));
        //$sinGroup[] = sin(deg2rad($array[$indexStart+$c][1]));
        //$cosGroup[] = cos(deg2rad($array[$indexStart+$c][1]));
    }

    //work out the average
    $sinAverage = array_sum($sinGroup) / count($sinGroup);
    $cosAverage = array_sum($cosGroup) / count($cosGroup);

    //return the averages
    return array($sinAverage,$cosAverage);

}