2011-12-08 5 views
0

多次元配列をループし、特定のキーの合計を表す値を返します。別のキーの値は<です=関数に渡された日付の値。ここでは、データアレイのサンプル配列である:PHPは日付値に基づいて配列から合計を計算する

Array 
(
[Nov 18, 2011] => Array 
    (
     [C] => 100 
     [I] => 100 
     [M] => 100 
    ) 
[Nov 22, 2011] => Array 
    (
     [C] => 200 
     [I] => 200 
    ) 
[Nov 29, 2011] => Array 
    (
     [C] => 300 
     [I] => -300 
    ) 
) 

これらの3つのカテゴリ[C]以上の存在になることはありませんが、[I]及び[M]と、各日付の値は、実行中の合計を考慮すべきです。

したがって、2011年11月22日現在の[C]カテゴリの値はどのように計算されますか?正しい値はもちろん300です。(11月18日100 + 11月22日200)

2011年11月29日現在の[I]の値を計算する必要がある場合はどうなりますか?この例の正解は0になります。(100 + 200 - 300)

これを達成するための最良のアイデアがあります。私の本能は何らかの機能を持っていて、カテゴリと日付の値を渡すことです。ありがとう。

+0

分かりやすくするために、 *それぞれの値は合計*であるべきですが、あなたの例は*再計算*を示しています。 –

答えて

2

あなたがこれをやりたいと思われる回数や、関数や単純なループを使用するかどうかにかかわらず、各カテゴリなどでそれを行う必要があるかどうかによって異なります。

いずれかの方法あなたは(私はこの例で使用しているハードコード化された「C」を置き換える)関数に以下を入れて、ちょうど$のtarget_dateおよびカテゴリに渡すことができます。

$c_total = 0; 
foreach($main_array as $date => $sub_array) 
{ 
    if($date <= $target_date) 
    { 
     $c_total += $sub_array["C"]; 
    } 
} 

EDITを:わかりやすくするために、strtotime()を使用して日付の値をタイムスタンプに変換して比較を容易にする関数を次に示します。

function getCategoryTotal($target_date, $category) 
{ 
    $c_total = 0; 
    $target_date = strtotime($target_date); 
    foreach($main_array as $date => $sub_array) 
    { 
     if(strtotime($date) <= $target_date) 
     { 
      $c_total += $sub_array[$category]; 
     } 
    } 
    return $c_total; 
} 
+0

素晴らしい、ありがとう。私はそれを試してみましょう。 – DanielAttard

+0

私はそれを動作させるいくつかの問題を抱えています。関数のバージョンに 'return'ステートメントがありません。それは意図的でしたか?何かにラップするか、そのまま使うかのように、日付の値に何かする必要がありますか? – DanielAttard

+0

私は自分の答えを編集して、関数からの戻り値を含めました。日付の値については、おそらくstrtotime()を使用してタイムスタンプ値に変換し、それを次に – TheOx

関連する問題