2016-09-19 5 views
0

コンプレックス探して質問に一致する日付の最も近いキー値を見つけることが、私はできるだけ単純にそれを説明してみましょう:私は2つのアレイ、AとBを持っているは、アレイ日の2セットを比較し、PHPで

アレイAには測定が行われた日付が含まれています。

アレイBには、測定でエラーが検出された日付が含まれています。

私は現在、グラフ(jpgraph)上のX軸として配列Aを持っています。さまざまな日付で何が起こったのかを確認するために、キー値を標準偏差としてプロットしています。私がやりたい何

基本的に配列Bのものに最も近い日付[キー値]で、グラフにマークを追加することです、私はそれぞれのアレイA内の最も近い日付を見つけたいです配列Bの項目を入力し、配列Aのキー値を出力してください。

質問を理解して助けてください。これはしばらく私を困惑させていました。

編集:配列を以下に示す:

アレイA:

Array ([0] => 2013-03-12 [1] => 2013-03-26 [2] => 2013-04-09 [3] => 2013-05-01 [4] => 2013-05-28 [5] => 2013-06-11 [6] => 2013-06-25 [7] => 2013-07-16 [8] => 2013-07-31 [9] => 2013-08-13 [10] => 2013-08-27 [11] => 2013-09-10 [12] => 2013-09-24 [13] => 2013-10-15 [14] => 2013-10-30 [15] => 2013-11-12 [16] => 2013-11-26 [17] => 2013-12-10 [18] => 2013-12-17 [19] => 2014-01-14 [20] => 2014-01-29 [21] => 2014-02-11 [22] => 2014-02-25 [23] => 2014-03-11 [24] => 2014-03-25 [25] => 2014-04-15 [26] => 2014-04-30 [27] => 2014-05-13 [28] => 2014-05-27 [29] => 2014-06-10 [30] => 2014-06-24 [31] => 2014-07-15 [32] => 2014-08-12 [33] => 2014-08-26 [34] => 2014-09-23 [35] => 2014-10-14 [36] => 2014-10-29 [37] => 2014-11-11 [38] => 2014-11-25 [39] => 2014-12-16 [40] => 2015-01-06 [41] => 2015-01-20 [42] => 2015-02-03 [43] => 2015-02-17 [44] => 2015-03-03 [45] => 2015-03-17 [46] => 2015-04-21 [47] => 2015-05-05 [48] => 2015-05-19 [49] => 2015-06-02 [50] => 2015-06-16 [51] => 2015-07-07 [52] => 2015-07-21 [53] => 2015-08-04 [54] => 2015-08-18 [55] => 2015-09-01 [56] => 2015-09-15 [57] => 2015-09-29 [58] => 2015-10-13 [59] => 2015-10-27 [60] => 2015-11-10 [61] => 2015-11-24 [62] => 2015-12-08 [63] => 2016-01-05 [64] => 2016-01-19 [65] => 2016-02-16 [66] => 2016-03-01)

アレイB:

Array ([0] => 2014-06-05 [1] => 2015-03-02 [2] => 2015-12-03)

編集2:

説明のジャストさらにビットので、私は最終的に希望の出力を次のように:

[29,44,62]

これらは、最も近いアレイAキーですB [0,1および2]にそれぞれ変換する。

+0

この問題を少しでも視覚化できるように、配列のコピーがありますか? –

+0

最初の投稿に感謝しました。 – TrailerTruck

答えて

0

私があなたの問題を理解した場合は、以下のコードを参考にしてください。いくつかの配列とそれがうまく動作するかどうかテストしました。

function getClosetsDates ($A, $B) 
{ 
    $answer = array(); 

    foreach ($B as $stringDateToAnalyze) { 
    //create a DateTimeObject with your B date 
    $dateToAnalyze = new DateTime($stringDateToAnalyze); 
    //iterates over A and compare your date with each date in A 
    $keyOfClosestDate = 0;//consider the first date of A as the closest one 
    $previousDifference = 9999; 

    foreach ($A as $key => $stringDateToCompare) { 
     $dateToCompare = new DateTime($stringDateToCompare); 
     //compare your B date with the current A date 
     $difference = $dateToCompare->diff($dateToAnalyze)->days; 
     if ($difference <= $previousDifference) { 
     $previousDifference = $difference; 
     $keyOfClosestDate = $key; 
     //you can unset $A[$key] if its not used anymore 
     } 
    } 
    $answer[] = $keyOfClosestDate; 
    } 

    return $answer; 
} 

以下は私がテストした例です。私は、ソリューションの分析を改善するために、より小さな配列を選択します。

$A = array 
(
    '0'=> "2013-02-19", 
    '1'=> "2013-02-22", 
    '2'=> "2013-02-15", 
    '3'=> "2013-01-29", 
    '4'=> "2013-01-27" 
); 

$B = array 
(
    '0'=> "2013-02-18", 
    '1'=> "2013-02-12" 
); 

var_dump(getClosetsDates($A,$B)); 

結果は次のとおりです。あなたが任意の改善を行う必要がある場合

array(2) { 
    [0] => 
    int(0) 
    [1] => 
    int(2) 
} 

、私はDateIntervalのドキュメントとdiff方法を提案します。

+0

未定義の変数:$ stringDateToCompare! – TrailerTruck

+0

@ TrailerTruck。それは最初のforeachのtypoでした。その正しい今。 – James

+0

よかった、ありがとう。今解決されました! – TrailerTruck