1

次の配列があるとします。

var dates = ['2012-10-01', '2012-10-02', '2012-10-03', '2011-01-01', '2011-01-02', '2011-06-03', '2010-09-01', '2010-09-02', '2010-08-22' ];

最終結果が次のようになるように、年、月、日ごとにグループ化する必要があります。

Array (
   "2012" => 
       Array ( "10" => Array ["01", "02", "03"] )

   "2011" =>
       Array ( "01" => Array ["01", "02"] )
       Array ( "06" => Array ["03"] )

   "2010" =>
       Array ( "09" => Array ["01", "02"] )
       Array ( "08" => Array ["22"] )
)

最後に、MM/DD/YYYY ドロップダウンを自動入力します。したがって、ユーザーが 2012 年を選択した場合、翌月のドロップダウン値は 10 のみで、その後に 01、02、03 のみを持つ日のドロップダウンが続きます。2011 年を選択すると、翌月のドロップダウンは 01、06 のみになります。 01 を選択すると、次の日は 01 または 02 になります。

誰も混乱させず、質問が明確であることを願っています。多次元配列は私が知っている中で最悪です。

理想的には Javascript でこれを行いたいのですが、PHP も問題ありません。1 つのアレイ イン、1 つのアレイ アウト。

4

3 に答える 3

3

これはそれを行います:

$dates = array('2012-10-01', '2012-10-02', '2012-10-03', '2011-01-01', '2011-01-02', '2011-06-03', '2010-09-01', '2010-09-02', '2010-08-22');

$out = array();

foreach($dates as $date)
{
    $parts = explode('-',$date);

    if (!isset( $out[$parts[0]] ))
        $out[$parts[0]] = array();

    if (!isset( $out[$parts[0]] [$parts[1]] ))
        $out[$parts[0]] [$parts[1]] = array();

    if (!in_array($parts[2], $out[$parts[0]] [$parts[1]] )) 
        $out[$parts[0]] [$parts[1]] [] = $parts[2];
}

var_dump($out);

出力:

array
  2012 => 
    array
      10 => 
        array
          0 => string '01' (length=2)
          1 => string '02' (length=2)
          2 => string '03' (length=2)
  2011 => 
    array
      '01' => 
        array
          0 => string '01' (length=2)
          1 => string '02' (length=2)
      '06' => 
        array
          0 => string '03' (length=2)
  2010 => 
    array
      '09' => 
        array
          0 => string '01' (length=2)
          1 => string '02' (length=2)
      '08' => 
        array
          0 => string '22' (length=2)
于 2012-07-10T01:25:23.843 に答える
2

Underscore.jsを使用する

_.map (list, iterator, [context]) Alias : collect
変換関数 (反復子) を介してリスト内の各値をマッピングすることにより、値の新しい配列を生成します。ネイティブ マップ メソッドが存在する場合は、代わりにそれが使用されます。リストが JavaScript オブジェクトの場合、反復子の引数は (値、キー、リスト) になります。

_.reduce (list, iterator, memo, [context])エイリアス: injectfoldl
inject および foldl とも呼ばれる reduce は、値のリストを 1 つの値に煮詰めます。Memo はリダクションの初期状態であり、その連続する各ステップは iterator によって返される必要があります。

例:

var dates = ['2012-10-01', '2012-10-02', '2012-10-03', '2011-01-01', '2011-01-02', '2011-06-03', '2010-09-01', '2010-09-02', '2010-08-22' ];
_.chain(dates)
    .map(function(date){ return date.split('-'); })
    .reduce(function(memo, num){ 
        if(!memo[num[0]]){ memo[num[0]] = {}; }
        if(!memo[num[0]][num[1]]){ memo[num[0]][num[1]] = []; }
        memo[num[0]][num[1]].push(num[2]);
        return memo;
    }, {})
    .tap(function(curVal){ alert(JSON.stringify(curVal)); })

//Produces
​{
   "2010":{
      "09":[
         "01",
         "02"
      ],
      "08":[
         "22"
      ]
   },
   "2011":{
      "01":[
         "01",
         "02"
      ],
      "06":[
         "03"
      ]
   },
   "2012":{
      "10":[
         "01",
         "02",
         "03"
      ]
   }
}
于 2012-07-10T01:36:24.050 に答える
0

まず、すべての日付文字列を個別の部分に解析します。次に、それらの部分を繰り返し処理し、適切な配列に入れます。

(非常に一般的な質問に対する非常に一般的な回答です。)

于 2012-07-10T01:20:16.053 に答える