我需要一些帮助和解释,因为我不太了解如何遍历数组并对某些数据进行算术平均。我刚刚开始使用php,所以一些解释会很好。
我有一个存储在变量$data
中的数组。它看起来像这样:
["data"]=>
array(22) {
[0]=>
object(stdClass)#234 (7) {
["Date"]=>
string(10) "2016-08-31"
["Open"]=>
string(9) "767.01001"
["High"]=>
string(10) "769.090027"
["Low"]=>
string(10) "765.380005"
["Close"]=>
string(10) "767.049988"
["Volume"]=>
string(7) "1247400"
["AdjClose"]=>
string(10) "767.049988"
}
[1]=>
object(stdClass)#240 (7) {
["Date"]=>
string(10) "2016-08-30"
["Open"]=>
string(10) "769.330017"
["High"]=>
string(10) "774.466003"
["Low"]=>
string(10) "766.840027"
["Close"]=>
string(10) "769.090027"
["Volume"]=>
string(7) "1127100"
["AdjClose"]=>
string(10) "769.090027"
}
它有大约22个条目,我想迭代每个[" AdjClose"]并对这个数字做一个意思,所以根据我的理解,我应该写如下:
if(@$data->data->AdjClose)
但这是我的问题开始的地方......有人可以向我解释如何迭代AdjClose并将这些数字的平均值存储在变量中吗?我很抱歉这个无聊的问题。
答案 0 :(得分:4)
以下是迭代解决方案的一个示例,因为您询问这是如何工作的:
// initialize sum and total
$sum = 0;
$total = 0;
foreach ($data->data as $obj) {
if (isset($obj->AdjClose)) { // verify that the current object has an AdjClose
$sum += $obj->AdjClose; // add it to the sum
$total++; // increment the count
}
}
echo $sum / $total; // display the average
我添加了if (isset($obj->AdjClose)
支票,因为您询问了if(@$data->data->AdjClose)
。我认为这暗示AdjClose
可能不存在于某些对象中。如果是这种情况,我想展示如何检查它而不是使用错误抑制运算符(@
)。如果您希望没有AdjClose
的项目作为零包含在平均值中,则可以将$total++
移到if
块之外。
如果您使用的是PHP 7,也可以使用array_column
执行此操作(但同样,除非您希望将平均值中缺少的AdjClose
属性包含为零,否则仅在{{1}时使用此属性}在所有对象上定义。)
AdjClose
答案 1 :(得分:3)
使用其中一个循环结构处理数组,我建议在这种情况下foreach
$cnt = 0;
$tot = 0;
foreach ( $data['data'] as $obj ) {
$cnt++;
$tot += (float)$obj->AdjClose;
}
$mean = $tot / $cnt;
echo 'The mean is ' . $mean;
答案 2 :(得分:1)
简单代码:
$total = 0;
foreach($data['data'] as $item) {
$total += (float)item->AdjClose;
}
$res = $total / count($data['data']);