Php 组多维数组

Php 组多维数组,php,javascript,arrays,multidimensional-array,Php,Javascript,Arrays,Multidimensional Array,给定以下数组: 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"]

给定以下数组:

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也可以。一个数组输入,一个数组输出。

首先,将所有日期字符串解析为各自的部分。然后,遍历这些部分,并将它们放入适当的数组中


(对于一个非常一般的问题,这是一个非常一般的答案。)

首先,将所有日期字符串解析为各自的部分。然后,遍历这些部分,并将它们放入适当的数组中

(对于一个非常一般的问题,这是一个非常一般的答案。)

这样就可以了:

$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)
这可以做到:

$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)
使用 (列表,迭代器,[context])别名:collect
通过转换映射列表中的每个值,生成一个新的值数组 函数(迭代器)。如果本机映射方法存在,将使用它 相反若列表是JavaScript对象,则迭代器的参数将为 (值、键、列表)

(列表、迭代器、备忘录、[context])别名:injectfoldl
reduce也称为inject和foldl,它将一系列值归结为 单一值。备注是还原的初始状态,每个 迭代器应该返回它的后续步骤

使用 (列表,迭代器,[context])别名:collect
通过转换映射列表中的每个值,生成一个新的值数组 函数(迭代器)。如果本机映射方法存在,将使用它 相反若列表是JavaScript对象,则迭代器的参数将为 (值、键、列表)

(列表、迭代器、备忘录、[context])别名:injectfoldl
reduce也称为inject和foldl,它将一系列值归结为 单一值。备注是还原的初始状态,每个 迭代器应该返回它的后续步骤


到目前为止你试过什么?这不是一个“怎么做”这是一个“帮助我因为一个问题而陷入困境”类型的地方你到目前为止都尝试了什么?这不是一个“怎么做”这是一个“帮助我因为一个问题而卡住了”类型的地方谢谢,但我现在不想使用外部库。不过,这将是最好的前端解决方案。谢谢,但我现在不想使用外部库。然而,这将是最好的前端解决方案。