通过数组迭代

时间:2016-09-01 19:44:56

标签: php arrays

我需要一些帮助和解释,因为我不太了解如何遍历数组并对某些数据进行算术平均。我刚刚开始使用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并将这些数字的平均值存储在变量中吗?我很抱歉这个无聊的问题。

3 个答案:

答案 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']);