2

さて、これは簡単なはずです。2つのアレイがあります。配列1の構造は次のとおりです。

[
    [                                        
        'value' => 3337
        'end_time' => '2012-10-07T07:00:00+0000'
    ],
    [
        'value' => 2811
        'end_time' => '2012-10-09T07:00:00+0000'
    ],
    [                                        
        'value' => 1318
        'end_time' => '2012-10-14T07:00:00+0000'
    ]

そして配列2:

[  
    [
        '_id' => '2012-10-07'
        'value' => 50
    ],
    [
        '_id' => '2012-10-09'
        'value' => 15
    ],
    [
        '_id' => '2012-10-10'
        'value' => 2
    ]
]

SO .... array1 [_id] = substr(array2 ['end_time']、0、10)に基づいて、配列1の要素を配列2の要素で除算したいと思います。

配列2には、配列1のすべてのIDの終了時刻値はありません。

結果の配列は次のようになります。

[
    '2012-10-01' => 0.11
    '2012-10-02' => 0 (if this date is not available in the second array). 
    '2012-10-03' => 0.12312
]

これを行う:

$kermit = array();
foreach($dauresult['data']['0']['values'] as $subdau) {  
    foreach($revenue['results'] as $subrev) {
          $date = substr($subdau['end_time'], 0, 10);
          if($date == $subrev['_id']) {
                $kermit[$date] = $subrev['value']/$subdau['value']; 
               } 
           }
    }

次のような配列を取得できます。

Array
(
    [2012-09-30] => 0.0044950554390171
    [2012-10-01] => 0.019565990750623
    [2012-10-05] => 0.015487397509869
    [2012-10-07] => 0.020177562550444
    [2012-10-09] => 0.0075150300601202
    [2012-10-10] => 0.00095831336847149
    [2012-10-11] => 0.0010183299389002
    [2012-10-12] => 0.0010126582278481
    [2012-10-13] => 0.029866666666667
    [2012-10-14] => 0.029779630732579
    [2012-10-15] => 0.011926058437686
    [2012-10-18] => 0.0018844221105528
    [2012-10-19] => 0.0005941770647653
    [2012-10-21] => 0.0023781212841855
    [2012-10-27] => 0.0011820330969267
    [2012-10-28] => 0.0011467889908257
)

しかし、私ができないことは、欠落している日付(10-20、10-16など)を0で表示することです。ばかげた問題ですが、それは私を少し狂わせています。助言がありますか?ありがとう!-シダ

4

3 に答える 3

2

この問題は、クエリ対象の範囲で配列を初期化することで解決できます。

$from = strtotime('2012-09-30'); $to = strtotime('2012-10-28');
for ($i = $from; $i < $to; $i += 86400) {
    $a[date('Y-m-d', $i)] = 0;
}

常に最も正しい解決策とは限りませんが、正しい方向に向けられるはずです。

于 2012-10-29T23:01:17.620 に答える
2

私の見方では、配列 2 に表示されない配列 1 の日付を最終的な配列に含める必要があります。これを行うには、作成したループを終了した後に 2 番目のループを実行できます。これは、最初のループで欠落している日付を追加するだけです。その 2 番目のループは次のようになります。

foreach($dauresult['data']['0']['values'] as $subdau) {  
    $date = substr($subdau['end_time'], 0, 10);
    if(!array_key_exists($date, $kermit))
        $kermit[$date] = 0;
}

最初のパスですべての日付が 2 番目のパスにあるかどうかを最初のパスで知る方法がないため、2 パスで実行する必要があると思います。私は間違っているかもしれません。

于 2012-10-29T23:02:01.017 に答える
2

最初の配列でarray_mapを使用します。

_id が 2 番目の配列に存在しない場合、コールバック関数は 0 を返し、存在する場合は計算の結果を返します。

//example arrays:
$firstArray = 
[
    [
        'value' => 3337,
        'end_time' => '2012-09-30T07:00:00+0000'
    ],
    [
        'value' => 2811,
        'end_time' => '2012-10-01T07:00:00+0000'
    ]
];

$secondArray = 
[
    [
        '_id' => '2012-09-30',
        'value' => 15
    ]
];

$resultingArray = array_map
(
    function($elementFromFirstArray) use ($secondArray)
    {
        foreach($secondArray as $elementFromSecondArray)
        {
            if($elementFromSecondArray['_id'] == substr($elementFromFirstArray['end_time'], 0, 10))
            {
                return $elementFromFirstArray['value']/$elementFromSecondArray['value'];
            }
        }
        return 0;
    }, 
    $firstArray
);
于 2012-10-29T22:52:08.410 に答える