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])别名:inject,foldl
reduce也称为inject和foldl,它将一系列值归结为 单一值。备注是还原的初始状态,每个 迭代器应该返回它的后续步骤 使用 (列表,迭代器,[context])别名:collect
通过转换映射列表中的每个值,生成一个新的值数组 函数(迭代器)。如果本机映射方法存在,将使用它 相反若列表是JavaScript对象,则迭代器的参数将为 (值、键、列表) (列表、迭代器、备忘录、[context])别名:inject,foldl
reduce也称为inject和foldl,它将一系列值归结为 单一值。备注是还原的初始状态,每个 迭代器应该返回它的后续步骤
到目前为止你试过什么?这不是一个“怎么做”这是一个“帮助我因为一个问题而陷入困境”类型的地方你到目前为止都尝试了什么?这不是一个“怎么做”这是一个“帮助我因为一个问题而卡住了”类型的地方谢谢,但我现在不想使用外部库。不过,这将是最好的前端解决方案。谢谢,但我现在不想使用外部库。然而,这将是最好的前端解决方案。