数组中n个元素组的PHP平均值
我有一个数组,它是通过上传和读取excel文件创建的 创建阵列的脚本如下所示:数组中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));
$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);
}