2016-09-01 17 views
-1

配列を反復処理していくつかのデータを算術平均する方法をよく理解していなかったので、助けと説明が必要です。私はちょうどPHPで私の道を始めるので、いくつかの説明がいいだろう。 変数$dataに配列が格納されています。それは次のようになります。 if(@$data->data->AdjClose)しかし:配列全体の反復

["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」]、すべてを反復処理して、この数字を意味するようにしたいですこれは私の問題が始まるところです...誰かが私に説明して、AdjCloseを反復してそれらの数値の平均を変数に格納する方法を教えてください。このノービスの質問には申し訳ありません。

+0

PHPのバージョンは? –

+0

このデータは 'json_decode()'で取得できますか?もしあなたが2番目のパラメータとして 'true'を追加すると、通常の配列を取得し、foreachループを使って簡単に目的のデータを得ることができます –

+1

@Anantあなたはオブジェクトの配列を簡単に繰り返すことができます – RiggsFolly

答えて

4

を示唆してループ構造の1つを使用して処理しているあなたはどのようにについて尋ねられたので、ここでは、反復解法の例ですそれはうまくいく:

// 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(@$data->data->AdjClose)について尋ねたので、彼はif (isset($obj->AdjClose)をチェックします。私は、AdjCloseがいくつかのオブジェクトに存在しない可能性があると考えました。そのような場合は、エラー抑制演算子(@)を使用するのではなく、チェックする方法を示したかったのです。 AdjCloseのないアイテムを平均としてゼロに含めたい場合は、$total++ifブロックの外に移動できます。


あなたはPHP 7持っている場合は、AdjCloseは、オブジェクトのすべての上に定義されている場合にのみ、これを使用し、あなたがゼロとしてあなたの平均でAdjCloseプロパティを行方不明に含める場合を除き、再び(しかしarray_columnを使用してこれを行うことができます)。

$average = array_sum(array_column($data->data, 'AdjClose'))/count($data->data) 
+0

私たちはお互いに恋をするでしょう、LOL – RiggsFolly

+0

@RiggsFollyまあ、私はそれぞれの答えが役に立つと思うと思います。 –

+0

ありがとうございます。すべての回答がうまくいきますが、何が起こっているのかを理解する助けとなるコメントのために、私にとっては役に立ちます。 – Alan

1

シンプルコード:

$total = 0; 
foreach($data['data'] as $item) { 
    $total += (float)item->AdjClose; 
} 

$res = $total/count($data['data']); 
+0

ありがとうございましたあなたの答えが働いてくれてありがとう、私はあなたの時間のためだけに感謝することができます誰もこの答えが動作するのを知りたい場合:) – Alan

3

配列が、私はこのケースでforeach

$cnt = 0; 
$tot = 0; 
foreach ($data['data'] as $obj) { 

    $cnt++; 
    $tot += (float)$obj->AdjClose; 
} 

$mean = $tot/$cnt; 
echo 'The mean is ' . $mean; 
+0

あなたの答えは非常にありがとう、助けてください – Alan

関連する問題