First of all, you should redesign your data structure. You aggregate the values in strings in $values
and then it’s difficult to extract and use the individual components.
$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,
);
}
Now, several array functions can be applied to do the job.
PHP does not provide a function to compute the average for a list of numbers but it is not difficult to write one:
function average(array $input)
{
return array_sum($input) / count($input);
}
Extract the values associated to 'sin'
in $values
, split the list in chunks of 5 items, apply the function average()
to each chunk. The result is a list of 288 values.
$avg288 = array_map(
'average',
array_chunk(
array_column($values, 'sin'),
5
)
);
Similar to above, split the list of 288 averages into 24 chunks of 12 values, apply average()
to each chunk, get a list of 24 numbers.
$avg24 = array_map(
'average',
array_chunk(
$avg288,
12
)
);
Read about array_sum()
, count()
, array_column()
, array_chunk()
, array_map()
.
Update
On PHP 5.4 array_column()
doesn’t work (because it was introduced in PHP 5.5.).
In this case you can compute the array returned by array_column()
in the initial loop, where $values
is created:
$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;
}
The use $sins
instead of array_column($values, 'sin')
in the computation of $avg288
.
6
solved PHP average by group of n elements in an array